Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Unity3d Mini Tutorial - pod wodą.


Gość henb

Rekomendowane odpowiedzi

Opublikowano

Witajcie,

Przeglądając swoje stare projekty natknąłem się na bardzo prosty trik, który może się Wam przydać przy tworzeniu FPSów. Chodzi o widok pod wodą.
Z racji tego, że spotkałem tutaj na kilku młodych programistów - nie będę trzymał się kodu źródłowego w pełni po angielsku. Będzie po polsku (jeśli ktoś ma pomysł jak przetłumaczyć Skybox to będę wdzięczny), żeby każdemu było łatwiej. Będzie też w C#, żeby kiedyś każdemu było łatwiej.

Zakładam, że macie już przygotowany teren z wodą.
5TZFdw7.png
(brzydki i na szybko)

Przechodzimy do kodu.

Potrzebujemy jednej zmiennej odpowiadającej za wysokość:
 

public int poziomWody = 5;

Publiczna, żeby łatwiej było dopasować wysokość w inspektorze.

 

Do tego jeszcze kilka zmiennych:
 

private Color _domyslnyKolor;
private bool _domyslnaMgla;
private float _gestosc; 
private Material _domyslnySkybox;
private Material _pustySkybox;

Przechodzimy do inicjalizacji:
 

void Start () {
	_domyslnyKolor = RenderSettings.fogColor;
	_domyslnaMgla = RenderSettings.fog;
	_gestosc = RenderSettings.fogDensity;
	_domyslnySkybox = RenderSettings.skybox;
	camera.backgroundColor = new Color(0, 0.3f, 0.5f, 1);

}

Co tutaj się dzieje? Do każdej zmiennej przypisuję to co jest domyślnie ustawione w projekcie, żeby przywrócić ten stan po wyjściu z wody. Jeżeli chodzi o kolor, to jego wartości zależą od Was. Nie chcę narzucać "jedynego słusznego" koloru, bo nie znam się na dopasowywaniu kolorów :D Ja ustawiłem niebieski. Na oko niebieski. Równie dobrze może to być zielony kwas.


No dobra. Wszystko ustawione, ale gdzie dzieje się tak zwana magia?
Dawać mięcho!

void Update() część pierwsza:
 

void Update () {
	if(this.transform.position.y < poziomWody)
	{
	        RenderSettings.fog = true;
		RenderSettings.fogColor = new Color(0, 0.3f, 0.5f, 0.5f);
		RenderSettings.fogDensity = 0.04f;
		RenderSettings.skybox = _pustySkybox;
	}

Jeżeli wysokość kamery spadnie poniżej wcześniej ustalonego poziomu to:
Włączam mgłę,
Zmieniam kolor mgły na taki sam kolor jak camera.backgroundColor, ale ze zmniejszoną alfą. Jej wartość też zależy od tego jaka Wam się podoba.
Ustawiam gęstość mgły na 0,04.
"Wyłączam" skybox ustawiając go na _pustySkybox, do którego nie jest przypisany żaden materiał.

 

ZQmw3N2.png

Część druga, czyli zaraz po wynurzeniu:

 

	else
	{
		RenderSettings.fogColor = _domyslnyKolor;
		RenderSettings.fog = _domyslnaMgla;
		RenderSettings.fogDensity = _gestosc;
		RenderSettings.skybox = _domyslnySkybox;
	}
}

Tutaj wszystko wraca do swojego domyślnego stanu. 

 

Kiedy skrypt jest gotowy, dodajemy go do kamery.

Upewnijcie się, że Skybox nie jest dodany do kamery, a jest ustawiony w Edit -> Render Settings.

Całość:
 

using UnityEngine;
using System.Collections;

public class PodWoda : MonoBehaviour {

	public int poziomWody = 5;

	private Color _domyslnyKolor;
	private bool _domyslnaMgla;
	private float _gestosc; 
	private Material _domyslnySkybox;
	private Material _pustySkybox;




	// Use this for initialization
	void Start () {
		_domyslnyKolor = RenderSettings.fogColor;
		_domyslnaMgla = RenderSettings.fog;
		_gestosc = RenderSettings.fogDensity;
		_domyslnySkybox = RenderSettings.skybox;
		camera.backgroundColor = new Color(0, 0.3f, 0.5f, 1);

	}
	
	// Update is called once per frame
	void Update () {
		if(this.transform.position.y < poziomWody)
		{
			RenderSettings.fog = true;
			RenderSettings.fogColor = new Color(0, 0.3f, 0.5f, 0.5f);
			RenderSettings.fogDensity = 0.04f;
			RenderSettings.skybox = _pustySkybox;
		}
		else
		{
			RenderSettings.fogColor = _domyslnyKolor;
			RenderSettings.fog = _domyslnaMgla;
			RenderSettings.fogDensity = _gestosc;
			RenderSettings.skybox = _domyslnySkybox;
		}
	}
}

Opublikowano

Wcześniej zajmowałem się programowaniem w c#. Od 2 lat pracuję jako developer w Unity.

Opublikowano

1. Większość rzeczy, które teraz robię niestety obejmuje NDA. Z rzeczy które robiłem wcześniej do "szuflady" poskładam inne tutoriale, o ile ten wzbudzi jakieś zainteresowanie.
2. Unity Pro + mobilne. W tutorialach postaram się nie korzystać z opcji dostępnych tylko w wersji pro, żeby każdy mógł z nich coś mieć.

Opublikowano

Czyli, że jak przekrocze to 100 tys. to muszę jeszcze kupić to Unity Pro i Android Pro czy, jak tam to się nazywa?

 

I jeszcze jedno, mógłbyś zobaczyć mój ostatni temat? Mam kolejny problem.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...