Unity3D官方案例--SurvivalShooter遊戲總結

最近花了幾天的時間來做U3D的案例,官方的案例SurvivalShooter,雖然一些遊戲模型以及場景都是下載的,但是視頻教程中對於自身對遊戲邏輯的理解還是很有幫助的,所以今天做完趁熱來總結一下。

1.首先是在一個3d遊戲中實現遊戲主角移動的功能:代碼如下

想要讀取軸向使用Input.GetAxis方法獲取下列默認軸: "Horizontal" 和"Vertical" 映射於控制桿、A、W、S、D和箭頭鍵(方向鍵)。 "Mouse X" 和"Mouse Y" 映射於鼠標,"Fire1", "Fire2" "Fire3"映射於鍵盤的Ctrl、Alt、Cmd鍵和鼠標中鍵或控制器的按鈕。新的輸入設置可以使用輸入管理器來添加。

//實現人物移動的封裝方法
float h = Input.GetAxisRaw ("Horizontal");//獲取水平方向上的值
float v = Input.GetAxisRaw ("Vertical");//獲取垂直方向上的值

void Move(float h,float v){
movement.Set (h, 0.0f, v);//movement是個vector3的變量
movement = movement.normalized*speed*Time.deltaTime;//規格化之後,返回一個與原來方向相同的但是長度爲1的向量
playerRigidBody.MovePosition (transform.position + movement);//移動到這個位置
}

2.第二是實現人物隨着鼠標的轉動而轉動的封裝方法

int floorMask;//地面碰撞層
float camRayLength = 100f;//發射出去射線的長度

//實現人物隨着鼠標的移動而進行轉動的封裝方法
void Turning(){
Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);//從攝像機發出一條起點爲攝像機,終點爲當前鼠標所在位置的射線,並且返回這條射線,記錄了射線的起點和方向
RaycastHit floorHit;//用來獲取從raycast函數中得到的信息反饋的結構
if(Physics.Raycast(camRay,out floorHit,camRayLength,floorMask)){//當光線投射與任何碰撞器交叉時爲真,否則爲假
Vector3 playerToMouse = floorHit.point - transform.position;//floorHit.point 指的是再世界空間中,光線碰撞到碰撞器的碰撞點
playerToMouse.y = 0f;
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);//創建一個旋轉,沿着forward(z軸)並且頭部沿着upwards(y軸)的約束注視。也就是建立一個旋轉,使z軸朝向view  y軸朝向up。
playerRigidBody.MoveRotation(newRotation);
}
}

3.實現攝像機跟隨人物的代碼

public Transform target;
public float smoothing = 5f;//平滑的速度值
Vector3 offset;//攝像機和人物的相對位置
// 由於人物是動態變化的,所以必須先計算出人物與攝像機的相對位置,然後再實時的獲取並更新攝像機的位置
void Start () {
offset = transform.position - target.position;
}

//攝像機實時跟隨人物進行移動
void FixedUpdate () {
Vector3 tarCamPosition = target.position + offset;//攝像機的目標位置等於當前的攝像機位置加上相對位置
transform.position = Vector3.Lerp (transform.position, tarCamPosition, smoothing * Time.deltaTime);//以某個速度從一個位置到另一個位置的函數
}

4.怪物自動追蹤主角的功能:

可以通過添加NavMeshAgent組件來實現,並且在代碼中用NavMeshAgent的setDestination的方法來設置追蹤對象的位置

5.怪物的攻擊範圍的實現可以通過給怪物加上一個碰撞體組件,比如球形碰撞體,膠囊碰撞體等等,如果碰撞體的觸發器觸發,說明到了怪物的攻擊範圍.如果退出了觸發器,那麼說明目標脫離的攻擊範圍,可以靈活的使用OnTriggerEnter與OnTriggerExit來實現.

6.當要使用遊戲物體的子對象時,可以通過FindGameObjectWithTag來找到,並對找到的對象的成員以及方法進行操作,當然,前提是該對象必須要有相應的tag;

7.讓怪物死亡之後下沉到地面,這是很常用的一種對怪物對象的處理方式,當然,得銷燬怪物對象,不然對象太多內存扛不住;

transform.Translate(-Vector3.up * sinkSpeed *Time.deltaTime);//讓物體以一定的速度下沉,並且要先讓運動學這個屬性生效才能下沉。isKinamatic這個屬性要爲true

8.要讓遊戲在相應的時刻播放相應的動畫時,那麼先要獲取到動畫Animator的對象,然後通過設置動畫播放時的參數來進行動畫的播放控制,比如setTrigger方法,setBool方法等。

9.一般實現怪物動態生成的方法是:將怪物生成的代碼封裝成函數,然後再start函數中通過InvokeRepeating函數來反覆的進行調用,下面是SurvivalShooting中進行怪物生成的封裝方法:

//生成怪物封裝的方法
void Spawn(){
if (playerHealth.currentHealth <= 0) {
return;
}
int pointIndex = Random.Range(0,spawnPoints.Length);
Instantiate (enemy, spawnPoints [pointIndex].position, spawnPoints [pointIndex].rotation);
}

反覆的初始化對象來進行怪物的生成!

10.讓遊戲結束之後再次調入遊戲場景,遊戲重新開始:

Application.LoadLevel (Application.loadedLevel);//調入當前已經調用的場景


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章