Відеоінструкція Unity fog of war із демонстрацією веб-програвача

У цьому відеоуроці я хочу розповісти вам про реалізацію туману війни в движку Unity. Ця техніка не потребує візуалізації текстури, тому її можна використовувати у безкоштовній версії Unity. Він також добре працює в мобільних пристроях.

Автор: Сергій Тарабан

:ad:
Частина 2. Мобільна версія Частина 3. Статичний і динамічний туман війни з використанням візуалізації до текстури

Демонстрація веб-програвача Unity.

демонстрація гри у туман війни

Використовуйте WASD або кнопки зі стрілками для переміщення

Завантажити файл пакета: fog_of_war_tutorial.unitypackage

Посібник "Туман війни".

Шейдер діафрагми Fog of War.

Ось шейдер, який я використовував у цьому підручнику для створення діафрагми на тумані військового літака.
// Шейдер FogOfWar
// Copyright (C) 2013 Сергій Тарабан 
//
// Цим надається безкоштовний дозвіл будь-якій особі, яка отримує копію цього програмного забезпечення та пов’язаних файлів документації («Програмне забезпечення»), працювати з Програмним забезпеченням без обмежень, включаючи, без обмежень, права на використання, копіювання, зміну, об’єднання, публікацію, розповсюдження, субліцензування та/або продаж копій Програмного забезпечення, а також дозволяти особам, яким надано Програмне забезпечення, робити це за таких умов:
// Наведене вище повідомлення про авторські права та це повідомлення про дозвіл мають бути включені до всіх копій або значних частин Програмного забезпечення.
// ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ «ЯК Є», БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, ЯВНИХ АБО НЕПРЯМИХ, ВКЛЮЧАЮЧИ, АРЕМЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЇ ПРИДАТНОСТІ ДЛЯ ПРОДАЖУ, ВІДПОВІДНОСТІ ДЛЯ КОНКРЕТНОЇ МЕТИ ТА ВІДСУМНОСТІ ПРАВ. АВТОРИ АБО ВЛАСНИКИ АВТОРСЬКИХ ПРАВ НЕ НЕСУТЬ ВІДПОВІДАЛЬНОСТІ ЗА БУДЬ-ЯКІ ПРЕТЕНЗІЇ, ЗБИТКИ АБО ІНШУ ВІДПОВІДАЛЬНІСТЬ В наслідок КОНТРАКТНОЇ ДІЇ, ДЕЛІКТУ ЧИ В ІНШОМУ ВИПАДКУ, ЩО ВИНИКАЄ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ, ВИКОРИСТАННЯ АБО ІНШИМИ ОПЕРАЦІЯМИ, ЧИ У ЗВ’ЯЗКУ З НИМ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ.
//

Шейдер “Custom/FogOfWar” { Властивості {     _Color (“Основний колір”, колір) = (1,1,1,1)     _MainTex (“Base (RGB) Trans (A)”, 2D) = “білий” {}     _FogRadius (“FogRadius”, Float) = 1,0     _FogMaxRadius(“FogMaxRadius”, Float) = 0,5     _Player1_Pos ("_Player1_Pos", вектор) = (0,0,0,1)     _Player2_Pos ("_Player2_Pos", вектор) = (0,0,0,1)     _Player3_Pos ("_Player3_Pos", вектор) = (0,0,0,1) }

SubShader {     Теги {“Queue”=“Transparent” “IgnoreProjector”=“True” “RenderType”=“Transparent”}     LOD 200     Суміш SrcAlpha OneMinusSrcAlpha     Відбір

    CGPROGRAM     #pragma surface surf Lambert vertex:vert

    sampler2D _MainTex;     fixed4     _Color;     float    _FogRadius;     float    _FogMaxRadius;     float4     _Player1_Pos;     float4     _Player2_Pos;     float4     _Player3_Pos;

    struct Input {         float2 uv_MainTex;         розташування float2;     };

    float powerForPos(float4 pos, float2 nearVertex);    void vert(inout appdata_full vertexData, out Input outData) {         float4 pos = mul(UNITY_MATRIX_MVP, vertexData.vertex);         float4 posWorld = mul(_Object2World, vertexData.vertex);         outData.uv_MainTex = vertexData.texcoord;         outData.location = posWorld.xz;     }

    void surf (Input IN, inout SurfaceOutput o) {         fixed4 baseColor = tex2D(_MainTex, IN.uv_MainTex) * _Color;

        float alpha = (1.0 - (baseColor.a + powerForPos(_Player1_Pos, IN.location) + powerForPos(_Player2_Pos, IN.location) + powerForPos(_Player3_Pos, IN.location)));

        o.Albedo = baseColor.rgb;         o.Alpha = альфа;     }

    //повертає 0, якщо (pos - nearVertex) > _FogRadius     float powerForPos(float4 pos, float2 nearVertex) {         float atten = clamp(_FogRadius - length(pos.xz - nearVertex.xy), 0.0, _FogRadius);

        return (1.0/_FogMaxRadius)*atten/_FogRadius;     }

    ENDCG }

Запасний варіант “Прозорий/VertexLit” }

 Сценарій Fog of War для гравців.

використання UnityEngine;
використання System.Collections;

публічний клас FogOfWarPlayer : MonoBehaviour {

публічне перетворення FogOfWarPlane;
public int Number = 1;

// Використовуйте це для ініціалізації
void Start () {

}

// Оновлення викликається один раз на кадр
void Оновити () {
	Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(transform.position);
	Промінь rayToPlayerPos = Camera.mainCamera.ScreenPointToRay(screenPos);
	int шарова маска = (int)(1<<8);
	удар RaycastHit;
	if(Physics.Raycast(rayToPlayerPos, out hit, 1000, layermask)) {
		FogOfWarPlane.GetComponent<Renderer>().material.SetVector("_Player" + Number.ToString() +"_Pos", hit.point);
	}
}

}

Автор: Сергій Тарабан

Схожі посилання