Не срабатывают изменения mainTextureOffset

Общие вопросы о Unity3D

Не срабатывают изменения mainTextureOffset

Сообщение Roman777 18 фев 2018, 14:10

Добрый день!
Сделал 2 кнопки, по нажатию 1й поворачиваю текстуру, по нажатию 2й пытаюсь переместить с помощью mainTextureOffset.
Синтаксис:
Используется csharp
        public static void TurnTexture(){
                if (Input.GetKeyDown (KeyCode.Mouse0)) {
                        Nullturn = Input.mousePosition.y;
                        angle0 = PoligActions.pMat1.GetFloat ("_UVangle");
                } else if (Input.GetKey (KeyCode.Mouse0)) {
                        float Yt = Input.mousePosition.y;
                        if (Yt != Nullturn) {
                                PoligActions.pMat1.SetFloat("_UVangle", angle0+2*All.Pi*(Nullturn-Yt)/Screen.height);
                        }
                }
        }
        public static void  MoveTexture(){
                if (Input.GetKeyDown (KeyCode.Mouse0)) {
                        NullMove = Input.mousePosition;
                        TexPos0 = PoligActions.pMat1.mainTextureOffset;
                } else if (Input.GetKey (KeyCode.Mouse0)) {
                        Vector2 Moved = Input.mousePosition;
                        if (Moved!= NullMove) {
//                              PoligActions.pMat1.mainTextureOffset = TexPos0 + new Vector2(NullMove.x-Moved.x,-NullMove.y+Moved.y);
                                PoligActions.pMat1.SetTextureOffset("_MainTex", TexPos0+Moved-NullMove);
                        }
                }
        }

Проблема в том, что если я при запуске приложения пытаюсь сразу двигать текстуру, она не двигается, хотя скрипт изменяет свой-во offset для материала (видно в редакторе).
При этом, если я сначала буду поворачивать текстуру, потом пробовать двигать её, то тут она уже двигается...
В чём может быть косяк?
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09

Re: Не срабатывают изменения mainTextureOffset

Сообщение Roman777 18 фев 2018, 14:23

Вот ещё что, попробовал в функцию перемещения добавить сначало поворот на незначительный угол:
Синтаксис:
Используется csharp
        public static void  MoveTexture(){
                if (Input.GetKeyDown (KeyCode.Mouse0)) {
                        PoligActions.pMat1.SetFloat("_UVangle", 0.00001f);
//                      PoligActions.pMat1.SetFloat("_UVangle", -2*0.5f);
                        NullMove = Input.mousePosition;
                        TexPos0 = PoligActions.pMat1.mainTextureOffset;
                } else if (Input.GetKey (KeyCode.Mouse0)) {
                        Vector2 Moved = Input.mousePosition;
                        if (Moved!= NullMove) {
//                              PoligActions.pMat1.mainTextureOffset = TexPos0 + new Vector2(NullMove.x-Moved.x,-NullMove.y+Moved.y);
                                PoligActions.pMat1.SetTextureOffset("_MainTex", TexPos0+Moved-NullMove);
                        }
                }
        }

Перемещаться текстурка стала, но вот что мне кажется странным, что для значения предварительного угла поворота 0.00001f текстурка перемещается очень мендленно по отношению к перемещению курсора, если же этот угол изменить, допустим до 0.5f(радианы), то это перемещение ощутимо быстрее становится.... я не очень понял, как связан offset с углом uv....
Код шейдера следующий:
Синтаксис:
Используется csharp
Shader "floor_shader" {
        Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _Color ("Color", Color) = (1,0,0,1)
      _UVangle ("AngleTexture", Range(0,6.28)) = 0
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
      };
      fixed4 _Color;
      sampler2D _MainTex;
      float _UVangle;
      float2 _UVang;
      void surf (Input IN, inout SurfaceOutput o) {
        float2 _UVang;
        float _cos = cos(_UVangle);
        float _sin = sin(_UVangle);
        _UVang.x = IN.uv_MainTex.x*_cos-IN.uv_MainTex.y*_sin;
        _UVang.y = IN.uv_MainTex.x*_sin+IN.uv_MainTex.y*_cos;
        o.Albedo = tex2D (_MainTex, _UVang).rgb*_Color.xyz;
//              o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb*_Color.xyz;
      }
      ENDCG
    }
    Fallback "Diffuse"
}
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09

Re: Не срабатывают изменения mainTextureOffset

Сообщение jetyb 19 фев 2018, 21:49

Синтаксис:
Используется csharp
      float2 _UVang;
      void surf (Input IN, inout SurfaceOutput o) {
        float2 _UVang;
        float _cos = cos(_UVangle);
        float _sin = sin(_UVangle);
        _UVang.x = IN.uv_MainTex.x*_cos-IN.uv_MainTex.y*_sin;
        _UVang.y = IN.uv_MainTex.x*_sin+IN.uv_MainTex.y*_cos;
        o.Albedo = tex2D (_MainTex, _UVang).rgb*_Color.xyz;
//              o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb*_Color.xyz;
      }
 

Тут может быть какая-то путаница с локальной и глобальной переменной float2 _UVang;
Кстати зачем считать синусы и косинусы в шейдере, когда их можно посчитать в коде и передать в шейдер?
Может еще материал в инспекторе выбран и своими обновлениями в Editor-e накладывает глюки.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Не срабатывают изменения mainTextureOffset

Сообщение Roman777 19 фев 2018, 22:03

Благодарю за идею про расчёты! Что-то о таком даже не подумал...)
Да и проглядел я что-то, что переменную и глобально и локально определил. Локальную переменную убрал, она там ни к чему, но ситуацию это, ровным счётом, никак не изменило.
Материал я назначаю только кодом:
Синтаксис:
Используется csharp
        private static GameObject GoByMesh1(Mesh mesh, Color col){
                GameObject Poly = new GameObject();
                Poly.AddComponent<MeshFilter>();
                MeshRenderer MRend = Poly.AddComponent<MeshRenderer>();
                MRend.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
                Poly.name = "Стена";
                pMat1 = new Material((Shader)Resources.Load("Shaders/floor_shader"));
//              pMat1 = MRend.sharedMaterial;
                pMat1.SetTexture("_MainTex",(Texture)Resources.Load ("i"));
                pMat1.SetColor("_Color",col);
                Poly.GetComponent<Renderer>().material=pMat1;
                MeshFilter mf = Poly.GetComponent<MeshFilter>();
                mf.mesh = mesh;
                return Poly;
        }
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19