1、 确保只有一颗敌人子弹,一颗自己的子弹出现。
clone子弹预设时,先判断clone体是否为空。物体克隆出来后,在场景中是真实存在的,其他脚本对他的操作也会返还到clone脚本中。
当clone体被销毁时,clone脚本中的clone体为null。不需要设置参数在各个script间传递。
2、 敌人的动画效果。
可以用Animation,也可以用纹理偏移量。二者都是在plane上进行,使用plane时,要使它的rotation.z为180,网格碰撞器朝向摄像机。
(a) renderer.material.mainTextureScale = new Vector2(1f/(float)2, 1f) ; mainTextureScale为纹理缩放量,在start中定义。
renderer.material.mainTextureOffset = new Vector2(1f/(float)2*i, 1f) ;mainTextureOffset为纹理偏移量,i为偏移值。
通过改变偏移值i和控制停留时间产生动画。
(b) 在Animation编辑器里,点击录制, 添加3个点。
设置缩放量,分别设置3个点的offset(在Animation的material上设置)。播放后是波形图,在波形图上选择点,设置Tangent值为Constant,使其不为
波形改变,而是3个点的状态瞬间改变。
最后设置播放为loop。
3、 使用plane时,一定注意使plane的正面面对摄像机(rotation.z=180)。
4、 子弹的拖尾。
对子弹添加Component下的Effects/Trail Renderer,选择拖尾效果材质球,修改time可改变长度。
5、 敌人的规则移动。
使用enum+switch/case组合
enum Move{ right, left, down1, down2 } Move enemyMove; void Update () { switch(enemyMove){ case Move.right: transform.Translate(new Vector3(5f,0,0)*Time.deltaTime, Space.World); if(Time.time>starttime+steptime){ enemyMove=Move.down1; starttime=Time.time; } break; case Move.left: transform.Translate(new Vector3(-5f,0,0)*Time.deltaTime, Space.World); if(Time.time>starttime+steptime){ enemyMove=Move.down2; starttime=Time.time; } break; case Move.down1: transform.Translate(new Vector3(0,-2f,0)*Time.deltaTime, Space.World); if(Time.time>starttime+1){ enemyMove=Move.left; starttime=Time.time; } break; case Move.down2: transform.Translate(new Vector3(0,-2f,0)*Time.deltaTime, Space.World); if(Time.time>starttime+1){ enemyMove=Move.right; starttime=Time.time; } break; } }
6、 障碍物被射中后的效果。
触发器检测+射线+逐像素判断+贴图替换
先定义好替换图片splat和自身的贴图myTex
public Texture2D splat; private Texture2D myTex; void Start () { myTex=(Texture2D)Instantiate(renderer.material.mainTexture);//获取贴图 renderer.material.mainTexture=myTex;//将贴图设置为获取的当前贴图 }
a、 先是触发器检测碰撞,找到碰撞点
b、 然后在碰撞点垂直于障碍物面做一条射线
c、 找到射线碰撞到的所有碰撞点,判断是否碰撞了bunker
d、 若碰撞到了,获取碰撞点的uv值
e、 将uv转化为屏幕坐标,判断碰撞点的像素的alpha值(alpha为0是空白)