UNITY, SHADER Шейдер Fog of War, вызывающий крах единства - PullRequest
0 голосов
/ 14 мая 2018

Вчера я применил Fog of war для своей игры RTS. Вчера вечером все работало нормально, перед тем как ложиться спать, я проверял все сцены за сценой и проверял множество тестов, чтобы убедиться, что все работает и все хорошо.

Но сегодня, когда я пытаюсь запустить игру, она загружает главное меню, но когда он пытается загрузить первый уровень, единство рушится и не дает мне повода.

Я пытался пройтись по коду и игровым объектам, пока не обнаружил, что если я удалю пользовательский шейдер, прикрепленный к местности, которую я использовал для создания тумана над картой, он перестанет нарушать единицу и продолжит запуск игры, однако я подключил его заново и он снова работал нормально, когда снова работал туман войны, но как только я закрыл единицу и открыл ее снова, возникла та же проблема с крахом при загрузке первого уровня.

Я не уверен, что это шейдер или код для него, который вызывает проблему. У меня мало опыта работы с шейдерами, но если кто-нибудь сможет взглянуть на код для него и сказать мне, если с ним что-то не так, я был бы очень признателен.

    Shader "Fog Of War/Terrain" {
    Properties {
        _FOWTex ("Detail", 2D) = "gray" {}

        // Splat Map Control Texture
        [HideInInspector] _Control ("Control (RGBA)", 2D) = "red" {}
        [HideInInspector] _Splat3 ("Layer 3 (A)", 2D) = "white" {}
        [HideInInspector] _Splat2 ("Layer 2 (B)", 2D) = "white" {}
        [HideInInspector] _Splat1 ("Layer 1 (G)", 2D) = "white" {}
        [HideInInspector] _Splat0 ("Layer 0 (R)", 2D) = "white" {}

        // used in fallback on old cards & base map
        // [HideInInspector] _MainTex ("BaseMap (RGB)", 2D) = "white" {}
        // [HideInInspector] _Color ("Main Color", Color) = (1,1,1,1)
    }
    SubShader {
        Tags { "RenderType"="Opaque" 
                "SplatCount" = "4"
            }
        CGPROGRAM
        #pragma surface surf Lambert nolightmap

        struct Input {
            float2 uv_FOWTex;
            float2 uv_Control : TEXCOORD0;
            float2 uv_Splat0 : TEXCOORD1;
            float2 uv_Splat1 : TEXCOORD2;
            float2 uv_Splat2 : TEXCOORD3;
            float2 uv_Splat3 : TEXCOORD4;
        };

        sampler2D _Control, _FOWTex;
        sampler2D _Splat0,_Splat1,_Splat2,_Splat3;

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 splat_control = tex2D (_Control, IN.uv_Control);
            fixed3 col;
            col  = splat_control.r * tex2D (_Splat0, IN.uv_Splat0).rgb;
            col += splat_control.g * tex2D (_Splat1, IN.uv_Splat1).rgb;
            col += splat_control.b * tex2D (_Splat2, IN.uv_Splat2).rgb;
            col += splat_control.a * tex2D (_Splat3, IN.uv_Splat3).rgb;
            o.Albedo = col;
            fixed3 c = tex2D (_FOWTex, IN.uv_FOWTex).aaa;
            c = 1-c;
            o.Albedo *= c;
        }
        ENDCG
    }
    FallBack off
}

1 Ответ

0 голосов
/ 15 мая 2018

Маловероятно, что шейдер вызывает сбой приложения.Если есть проблема с шейдером, то Unity не сможет скомпилировать шейдер, и все, что использовало его, будет отображаться сплошным ярко-розовым.

Я не вижу ничего страшного в шейдере, но эта строка:

float2 uv_FOWTex;

в вашей структуре ввода, я думаю, вероятно, не нужна.

Для отладкиВы можете сократить шейдер Fog of War до базового и простого уровня.Тогда посмотрите, продолжает ли он падать.Если этого не произойдет, то постепенно добавляйте кусочки шейдера обратно, пока не сделаете.

Но когда дело доходит до сбоев, обычно от вас делают что-то плохое с вызовами неуправляемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...