遊戲製作之路(21)程式碼整理
前面介紹了角色是否到達地面的檢測,並且程式碼都是不斷地新增進來的,並沒有進行整體的設計,你會發現程式碼的效率有點低了。在這裡,我們來把程式碼整理一下,讓這些程式碼更加高效,並且更加有條理,更容易理解。在程式碼裡,發現如下的程式碼:
GetComponent<CharacterController>()
已經引用兩遍了,這樣會導致需要查詢這個角色元件兩遍,這樣效率就會降低,所以在類裡就可以定義一個CharacterController物件,用來儲存角色物件,這樣就不用每幀更新遊戲時,再查詢兩遍。因此,在類裡新增一行程式碼如下:
private CharacterController controller;
並且controller只需要在Start()函式裡更新一次,就儲存了角色物件,不用每次更新幀時才獲取,這樣大地提高了指令碼的效率。
接著下來,我們來定義一個移動的速度moveVelocity,讓這個移動速度只能在地面進行移動,不能在空中移動,因為這個角色不是飛機,不能憑空飛行。新增一行定義變數:
private Vector3 moveVelocity = Vector3.zero;
接著下來,就會把程式碼修改成這樣:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BasicMovement : MonoBehaviour { public float speed = 10.0f; public float rotationSpeed = 2.0f; public Transform head; public float maxHeadRotation = 80.0f; public float minHeadRotation = -80.0f; private float currentHeadRotation = 0; private float yVelocity = 0; public float jumpSpeed = 15.0f; public float gravity = 30.0f; private CharacterController controller; private Vector3 moveVelocity = Vector3.zero; // Use this for initialization void Start () { controller = GetComponent<CharacterController>(); } // Update is called once per frame void Update () { Vector2 mouseInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); if (controller.isGrounded) { yVelocity = 0; if (Input.GetButtonDown("Jump")) { yVelocity = jumpSpeed; } moveVelocity = transform.TransformDirection(new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"))) * speed; } yVelocity -= gravity * Time.deltaTime; transform.Rotate(Vector3.up, mouseInput.x * rotationSpeed); currentHeadRotation = Mathf.Clamp(currentHeadRotation + mouseInput.y * rotationSpeed, minHeadRotation, maxHeadRotation); head.localRotation = Quaternion.identity; head.Rotate(Vector3.left, currentHeadRotation); Vector3 velocity = moveVelocity + yVelocity * Vector3.up; controller.Move(velocity * Time.deltaTime); } }
在這裡,已經判斷接觸地面,才開始進行移動,所以放在接地判斷的條件語句裡面。下面這行:
Vector3 velocity = moveVelocity + yVelocity * Vector3.up;
就是把平面的移動速度和向上跳動、落下的速度進行組合。然後一起在controller.Move裡移動,這樣就構成一個完美的角色控制系統。
到這裡,已經實現遊戲基本的功能,你可以盡情地玩了。
跟老菜鳥學C++
http://edu.csdn.net/course/detail/2901
跟老菜鳥學python
http://edu.csdn.net/course/detail/2592
在VC2015裡學會使用tinyxml庫
http://edu.csdn.net/course/detail/2590