一、 确保只有一颗敌人子弹,一颗本身的子弹出现。编辑器
clone子弹预设时,先判断clone体是否为空。物体克隆出来后,在场景中是真实存在的,其余脚本对他的操做也会返还到clone脚本中。oop
当clone体被销毁时,clone脚本中的clone体为null。不须要设置参数在各个script间传递。动画
二、 敌人的动画效果。spa
能够用Animation,也能够用纹理偏移量。两者都是在plane上进行,使用plane时,要使它的rotation.z为180,网格碰撞器朝向摄像机。code
(a) renderer.material.mainTextureScale = new Vector2(1f/(float)2, 1f) ; mainTextureScale为纹理缩放量,在start中定义。orm
renderer.material.mainTextureOffset = new Vector2(1f/(float)2*i, 1f) ;mainTextureOffset为纹理偏移量,i为偏移值。blog
经过改变偏移值i和控制停留时间产生动画。图片
(b) 在Animation编辑器里,点击录制, 添加3个点。ip
设置缩放量,分别设置3个点的offset(在Animation的material上设置)。播放后是波形图,在波形图上选择点,设置Tangent值为Constant,使其不为it
波形改变,而是3个点的状态瞬间改变。
最后设置播放为loop。
三、 使用plane时,必定注意使plane的正面面对摄像机(rotation.z=180)。
四、 子弹的拖尾。
对子弹添加Component下的Effects/Trail Renderer,选择拖尾效果材质球,修改time可改变长度。
五、 敌人的规则移动。
使用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; } }
六、 障碍物被射中后的效果。
触发器检测+射线+逐像素判断+贴图替换
先定义好替换图片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是空白)