Unity C# 脚本来实现Cube旋转并渐变材质的功能

这篇具有很好参考价值的文章主要介绍了Unity C# 脚本来实现Cube旋转并渐变材质的功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity C# 脚本实现Cube旋转并渐变材质的功能

第一步:创建脚本

创建一个 C# 脚本,可以通过以下步骤完成:

  1. 打开 Unity,并在项目文件夹中创建一个新的 C# 脚本。命名为 MultipleCubeRotateMonitor

  2. 在脚本中引入需要的命名空间:

    using System.Collections.Generic;
    using System.Reflection;
    using UnityEngine;
    
  3. 在脚本中定义一个类 MultipleCubeRotateMonitor 并继承自 MonoBehaviour。这个类将管理多个立方体的旋转和材质颜色插值。

    using System.Collections.Generic;
    using System.Reflection;
    using UnityEngine;
    public class MultipleCubeRotateMonitor : MonoBehaviour
    {
        public List<Transform> cubeTransforms; // Cube 的 Transform 组件数组
    	public List<Renderer> cubeRenderers; // Cube 的 Renderer 组件数组(用于获取材质)
    
    	public float offsetAngle = 45f; // 自定义角度变化最大范围的绝对值
    
    	public float StartYAngle = 0f; // Cube 的初始 Y 轴旋转角度
        
        void Update()
        {
             for (int i = 0; i < cubeTransforms.Count; i++)
            {
                Transform cubeTransform = cubeTransforms[i];
                
                // 获取原生值
                System.Type transformType = cubeTransform.GetType();
                PropertyInfo m_propertyInfo_rotationOrder = transformType.GetProperty("rotationOrder", BindingFlags.Instance | BindingFlags.NonPublic);
                object m_OldRotationOrder = m_propertyInfo_rotationOrder.GetValue(cubeTransform, null);
                MethodInfo m_methodInfo_GetLocalEulerAngles = transformType.GetMethod("GetLocalEulerAngles", BindingFlags.Instance | BindingFlags.NonPublic);
                object value = m_methodInfo_GetLocalEulerAngles.Invoke(cubeTransform, new object[] { m_OldRotationOrder });
                float currentAngle = ((Vector3) value).y;//cubeTransform.rotation.eulerAngles.y; // 获取 Cube 当前的 Y 轴旋转角度
    
                // 将角度限制在 -360 到 360 之间
                if (currentAngle > 360)
                {
                    currentAngle -= 360;
                }
                else if (currentAngle < -360)
                {
                    currentAngle += 360;
                }
                // 计算当前角度与StartYAngle的差值
                float angleDiff = currentAngle - StartYAngle;
                //如果插值大于offsetAngle,lerpValue为1,否则为angleDiff/offsetAngle
                float lerpValue = Mathf.Abs(angleDiff) > offsetAngle ? 1 : Mathf.Abs(angleDiff) / offsetAngle;
                var cubeRenderer= cubeRenderers[i];
                // 获取 Cube 的材质
                Material cubeMaterial = cubeRenderer.material;
                // 设置材质中的 _LerpValue 参数
                cubeMaterial.SetFloat("_LerpValue", lerpValue);
            }
        }
    }
    
    
  4. 在脚本中添加需要的公共变量,例如立方体的 Transform 组件数组 cubeTransforms,Renderer 组件数组 cubeRenderers,以及一些控制旋转和颜色插值的参数。

  5. Update() 方法中,编写代码来遍历每个立方体,获取其当前的旋转角度,并根据角度计算颜色插值参数。

  6. 最后,在循环中更新立方体的材质颜色参数。

第二步:创建材质球和着色器

  1. 创建一个新的着色器:在 Unity 中创建一个新的 Shader 文件,命名为 Custom/LerpShader,并将下面的代码粘贴进去。

  2. 在着色器中定义 _LerpValue 参数,这个参数将用于在顶点着色器和片段着色器之间进行颜色插值。

  3. 着色器的 Properties 区域定义了需要的属性,例如 _MainTex(纹理)、_LerpValue(插值值)和 _LerpColor(插值颜色)。

  4. 在着色器的 SubShader 区域中,定义了顶点着色器和片段着色器。在片段着色器中,使用 lerp 函数根据 _LerpValue 在两种颜色之间进行插值。

  5. 将着色器保存并在 Unity 中创建一个新的材质,将这个着色器分配给该材质。可以调整 _LerpValue_LerpColor 的值以预览颜色插值效果。

Shader "Custom/LerpShader"
{
    Properties
    {
        _MainTex ("Texture 1", 2D) = "white" {}
        _LerpValue ("Lerp Value", Range(0, 1)) = 0
        _LerpColor ("Lerp Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float _LerpValue;
            fixed4 _LerpColor;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 tex1 = tex2D(_MainTex, i.uv);
                
                fixed4 finalColor = lerp(tex1, _LerpColor, _LerpValue);

                return finalColor;
            }
            ENDCG
        }
    }
}

第三步:将脚本应用于立方体

  1. 在 Unity 场景中创建一些立方体对象。

  2. 将刚刚创建的脚本 MultipleCubeRotateMonitor 拖放到场景中的一个空对象上,确保这个脚本可以管理多个立方体。

  3. 在脚本的 cubeTransformscubeRenderers 变量中分别将立方体的 Transform 组件和 Renderer 组件分配给这些数组。确保列表的顺序与场景中的立方体顺序对应。

  4. 调整脚本中的参数(例如 offsetAngleStartYAngle)以及材质中的 _LerpColor,观察立方体旋转和颜色插值的效果。
    Unity C# 脚本来实现Cube旋转并渐变材质的功能,Unity,unity,c#,材质

通过这个教程,你可以学会在 Unity 中使用 C# 脚本和自定义着色器来实现立方体旋转和颜色插值的效果。文章来源地址https://www.toymoban.com/news/detail-777260.html

到了这里,关于Unity C# 脚本来实现Cube旋转并渐变材质的功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity通过脚本更改物体的材质

       

    2024年02月12日
    浏览(37)
  • Unity中C#如何访问并修改Shader材质

    我们写好Shader后,很多效果是需要结合脚本来控制显示的。我们在这篇文章中,使用C#脚本来访问修改材质中的属性,来体验一下脚本怎么控制Shader材质在游戏中互动时变化 我们 OnGUI 这个生命周期函数中,进行操作 void OnGUI() { } 使用GUI.Button(position,text);可以绘制一个按钮 pu

    2024年02月04日
    浏览(44)
  • 【Unity入门】11.脚本控制物体旋转

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (1)创建RotateLogic脚本     上一篇文章我们学习了如何在脚本中获取物体对象,并使用transform组件下的translate接口使物体运动     今天我们进一步学习,用脚本控制物体的旋转。首先

    2024年02月04日
    浏览(45)
  • Unity 游戏开发、01 基础知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(60)
  • Unity 游戏开发、01 基础篇 | 知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(57)
  • Unity中C#使用协程控制Shader材质变化

    在上一篇文章实现了C#脚本简单修改Shader材质的效果后,我们使用按钮点击结合协程来实现一下游戏中角色常见的效果:受击、中毒、消融效果 我们继续使用上一篇的 Shader 和 C# 脚本来继续测试 Unity中C#如何访问并修改Shader材质 Unity中的协程可以理解为 C# 中多线程的作用,在

    2024年02月04日
    浏览(51)
  • 7. unity脚本控制物体运动(转向、移动、旋转)

    1. 移动物体: 在界面中添加一个物体,并给这个物体添加一个脚本文件,在脚本文件当中如果想控制物体运动,就需要在 unity 每一帧更新的时候,给物体的坐标值重新赋值,这样就能按照帧更新速率实时的更改物体的位置,实现移动效果。 位置更新的代码应该写在***update

    2023年04月12日
    浏览(54)
  • Unity3D 脚本3(旋转)

    一、物体的旋转 给物体调转一个旋转角度。 1、Quaternion四元组(x,y,z,w) transfrom.rotation()=... 不方便操作,官方不建议用 2、Euler Angle 欧拉角 transfrom.eulerAngles = new Vector(0,45,0); transfrom.LocalE ulerAngles = new Vector(0,45,0); 这样就可以让物体旋转45度。 在Update 中修改角度持续旋转 Vecto

    2023年04月16日
    浏览(72)
  • Unity 3d角色展示脚本(旋转 平移 缩放)展示界面

    不考虑性能 很简陋的一个功能,主要是用于角色渲染的观察用,比simplecontroller要好用一点

    2024年02月11日
    浏览(54)
  • Unity角色或摄像机移动和旋转的控制脚本

    该脚本挂载到需要被移动、旋转控制的物体身上,也可以之间挂在到摄像机上! 挂载到摄像机上可以实现第一人称视角控制! 挂载到物体身上,配合摄像机跟踪脚本可以实现,第三人称视角控制!  将角色控制脚本挂给摄像机即可! 以下是角色控制脚本: 将上面, 角色控

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包