zoukankan      html  css  js  c++  java
  • Unity3D 创建动态的立方体图系统

    Unity3D 创建动态的立方体图系统

    这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统。

    准备工作如下:

    1. 创建一个新的场景、一个球体。提供给场景一个平行光,准备2个立方体图
    2. 添加两个空对象,并分别命名为Empty1和Empty2,给他们分配不同的位置
    3. 给球体添加一个新的材质,并使用FresnelReflection Shader(上一篇)。
    4. 最后,创建一个脚本,并命名为CubeDynamic.cs,把它赋给球体。

    A:下面开始编写脚本:

    //2个立方体图;

        public Cubemap cubeMapA;
    
        public Cubemap cubeMapB;

    //2个参考位置Empty12;

        public Transform posA;
    
        public Transform posB;
    
     
    
        private Material tempMat;
    
        private Cubemap tempCubeMap;
    
      private int times = 0;

    B:为了方便观测Empty12的位置,我们使用OnDrawGizmos函数来绘制对象:

        void OnDrawGizmos() {
    
            Gizmos.color = Color.green;
    
            if(posA){
    
                Gizmos.DrawWireSphere(posA.position,5);
    
            }
    
            if(posB){
    
                Gizmos.DrawWireSphere(posB.position,5);
    
            }
    
        }

     

    C创建一个新的函数来决定在不同的位置我们应该使用哪个Cubemap

       

    private Cubemap GetUseCubeMap() {
    
            float lengthA = Vector3.Distance(transform.position,posA.position);
    
            float lengthB = Vector3.Distance(transform.position,posB.position);
    
            if(lengthA>lengthB){
    
     
    
                return cubeMapB;
    
            }
    
            else if (lengthA < lengthB)
    
            {
    
                return cubeMapA;
    
            }
    
            else {
    
                return cubeMapA;
    
            }
    
    }

    D:在Update函数中进行赋值

    void Update () {
    
            times++;
    
            if(times%20==0){//避免每一帧都计算;
    
                tempMat = renderer.sharedMaterial;
    
                if (tempMat)
    
                {
    
                    tempCubeMap = GetUseCubeMap();
    
                    tempMat.SetTexture("_CubeMap", tempCubeMap);
    
                  
    
                }
    
                times = 0;
    
            }
    
    }

    保存脚本,返回Unity编辑器。点击Play按钮,并前后左右移动球体。你将会看到类似下面的效果

     

     

     

     

    通过上面简单的代码,我们可以看出程序会固定帧数为一个时间段来判断球体和2个参考位置的间距来计算自身使用哪一种cubemap,再把cubemap赋值给自己。这样就完成了简单的变换。

  • 相关阅读:
    ACwing(基础)--- 树状数组
    ACwing(基础)--- 快速幂
    Oracle for loop 循环
    Oracle 为表增加时间戳字段
    Oracle Materialized View 物化视图
    Splunk DBConnect使用
    Splunk 过滤接入数据
    Python 协程库 asyncio 的简单理解和使用
    Python 正则使用 备查
    Splunk 数据接入 创建索引接收数据
  • 原文地址:https://www.cnblogs.com/2Yous/p/4238392.html
Copyright © 2011-2022 走看看