一,實現思路
制作子彈的預制體,然后在腳本的Update()中進行監聽用戶是否點擊鼠標左鍵,如果用戶點擊鼠標左鍵,則加載之前制作的子彈預制體,並在槍口的附近位置生成子彈。而且考慮到槍口位置隨用戶游戲視角變化,非固定,所以子彈生成位置不能為絕對位置,而是相對位置。但這里有個問題出現了,那就是子彈發射出去的時候為絕對位置(如果為相對位置的話,發射出去的子彈會隨着槍口位置變化,發生變化。錯誤演示如下圖)
為了解決以上的問題,一個解決辦法就是,在槍口附近新建一個空物體集(Bullets),並將子彈生成為該物體集的子對象,然后因為該物體集本身也為槍口的子物體,所以保證子彈處於槍口的相對位置,最后在發射的時候調用該物體集的DetachChildren(),解除該物體集跟子彈的父子關系,讓子彈發射之后為絕對位置。
解決完子彈發射的位置問題之后,只要通過Destroy()將發射后的子彈物體銷毀,整個子彈發射功能就完成了。
二,實現代碼
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FireScript : MonoBehaviour { public GameObject BulletPrefab;//子彈預制體 public GameObject Bullets;//子彈物體集 public Camera PlayerCamera;//玩家攝像頭 public int BulletSpeed = 800;//子彈速度 private int index=0;//子彈計數 void Update() { if(Input.GetKeyDown(KeyCode.Mouse0))//監測鼠標左鍵是否被點擊 { index++;//子彈計數 GameObject BulletGameObject = Instantiate(BulletPrefab);//加載預制體 BulletGameObject.name = "Bullet"+index; BulletGameObject.transform.parent = Bullets.transform;//設置子彈父對象 BulletGameObject.transform.localPosition = new Vector3((float)(-1),0,(float)(-0.02));//在指定坐標生成子彈 BulletGameObject.transform.rotation = PlayerCamera.transform.rotation; Bullets.transform.DetachChildren();//解除父子關系 BulletGameObject.GetComponent<Rigidbody>().AddForce(PlayerCamera.transform.forward * BulletSpeed);//給予子彈一個向前的推進力 Destroy(BulletGameObject,2);//銷毀子彈物體 } } }
三,腳本的使用方法
在槍口物體下新建物體集,並將物體集和子彈預制體,玩家攝像頭綁定在腳本上(如下圖)。