版本:unity 5.4.1 语言:C#
参考实战核心技术的第七章,不过只分析了其中核心的代码。
与之前的换装核心有点像,但此次是直接新建一个对象,只替换material、mesh两个,并没有涉及到骨骼的添加。
下面来看看代码:
Material mat = null; //残影的材质
float colorA = 1f; //残影当前的透明度
// Use this for initialization
void Start ()
{
// 获取对象的皮肤渲染
SkinnedMeshRenderer meshRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();
// 烘培出当前的网格
Mesh mesh = new Mesh();
meshRenderer.BakeMesh(mesh);
// 新建一个残影
GameObject go = new GameObject();
go.hideFlags = HideFlags.HideAndDontSave; //在Hierarchy中不显示,并保留到新场景中
// 添加MeshFilter、MeshRenderer的情况
//MeshFilter goMeshFilter = go.AddComponent<MeshFilter>();
//goMeshFilter.mesh = mesh;
//MeshRenderer goMeshRenderer = go.AddComponent<MeshRenderer>();
//goMeshRenderer.material = meshRenderer.material;
// 添加SkinnedMeshRenderer的情况
SkinnedMeshRenderer goSkinnedMeshRenderer = go.AddComponent<SkinnedMeshRenderer>();
goSkinnedMeshRenderer.material = meshRenderer.material; //添加材质
goSkinnedMeshRenderer.sharedMesh = mesh; //添加网格
// 将残影放到原对象的上一格
go.transform.position = (gameObject.transform.position + new Vector3(0, 1f, 0));
go.transform.rotation = gameObject.transform.rotation;
// 替换能够透明显示的Shader
//mat = goMeshRenderer.material;
mat = goSkinnedMeshRenderer.material;
mat.shader = Shader.Find("JiuYinT/Toon/Basic Replace");
}
// Update is called once per frame
void Update ()
{
if (mat == null)
return;
// 渐变消失的效果
colorA -= Time.deltaTime;
if (colorA <= 0f)
colorA = 1f;
Color col = mat.GetColor("_Color");
col.a = colorA;
mat.SetColor("_Color", col);
}
我用了个球做测试,不过出现了一个问题:
编辑器中正常显示,但下面的Game窗口下的显示就。。
直接变全黑了,找了组里的美工询问原因,估计是Shader的原因,换成Standard就正常了,老版本的Shader无法在新版本中使用啊。具体Shader是什么原因,我会过一段时间仔细研究一下Unity的光照、Shader系统。