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赋值给自己。这样就完成了简单的变换。