一、 確保只有一顆敵人子彈,一顆本身的子彈出現。編輯器
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是空白)