Unity3D 创建动态的立方体图系统
这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统。
准备工作如下:
- 创建一个新的场景、一个球体。提供给场景一个平行光,准备2个立方体图。
- 添加两个空对象,并分别命名为Empty1和Empty2,给他们分配不同的位置。
- 给球体添加一个新的材质,并使用FresnelReflection Shader(上一篇)。
- 最后,创建一个脚本,并命名为CubeDynamic.cs,把它赋给球体。
A:下面开始编写脚本:
//2个立方体图;
public Cubemap cubeMapA; public Cubemap cubeMapB;
//2个参考位置Empty1,2;
public Transform posA; public Transform posB; private Material tempMat; private Cubemap tempCubeMap; private int times = 0;
B:为了方便观测Empty1,2的位置,我们使用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赋值给自己。这样就完成了简单的变换。