1、新建unity3d項目,在項目中導入CharacterController包。在游戲中創建Plane作為地面,把Plane的Tag設為Ground。創建Directional light照亮游戲世界。把第三人稱控制器放到Plane上面,之后把掛載第三人稱的腳本Remove掉,把它的Tag設為Player。
2、創建LookTargetPos腳本,把它掛載到第三人稱控制器上。它的作用是當鼠標左鍵按下且按下的位置為Plane時,第三人稱控制器朝向鼠標按下方向。
using UnityEngine; using System.Collections; public class LookTargetPos : MonoBehaviour { public static Vector3 targetPos;//用來保存鼠標點擊到地面的位置 private bool isMouseDown = false;//判斷鼠標左鍵是否一直按下 void Start() { targetPos = this.transform.position; } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { isMouseDown = true; LookAtPos(); } else if (Input.GetMouseButtonUp(0)) { isMouseDown = false; } //如果鼠標左鍵一直按下,則一直更新鼠標位置 if (isMouseDown == true) { LookAtPos(); } } void LookAtPos() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; bool isCollider = Physics.Raycast(ray, out hitinfo); //判斷鼠標是否點擊地面 if (isCollider == true && hitinfo.collider.tag == "Ground") { targetPos = hitinfo.point; targetPos.y = this.transform.position.y; this.transform.LookAt(targetPos); } } }
3、創建PlayerMove腳本,把它掛載到第三人稱控制器上。它的作用是控制第三人稱控制器移動到鼠標左鍵按下的位置。
using UnityEngine; using System.Collections; public enum Playerstate { Moveing, Idle } public class PlayerMove : MonoBehaviour { private CharacterController controller; public int speed = 4; private float distance;//用來保存游戲主角和目標點的距離 public Playerstate state;//保存游戲主角的狀態 // Use this for initialization void Start() { controller = this.GetComponent<CharacterController>(); state = Playerstate.Idle; } // Update is called once per frame void Update() { Move(); } void Move() { distance = Vector3.Distance(this.transform.position, LookTargetPos.targetPos); if(distance>0.05f) { controller.SimpleMove(this.transform.forward * speed); state = Playerstate.Moveing; print(distance); } else { state = Playerstate.Idle; } } }
4、創建PlayerState腳本,把它掛載到第三人稱控制器上。它的作用是控制第三人稱控制器動畫播放。
using UnityEngine; using System.Collections; public class PlayerState : MonoBehaviour { private PlayerMove playerState; private float distance; // Use this for initialization void Start() { playerState = this.GetComponent<PlayerMove>(); } // Update is called once per frame void LateUpdate() { //如果游戲主角在移動就播放跑的動畫 if (playerState.state == Playerstate.Moveing) { PlayAnimation("run"); } //如果游戲主角在等待就播放站的動畫 else if (playerState.state == Playerstate.Idle) { PlayAnimation("idle"); } } void PlayAnimation(string animationName) { animation.CrossFade(animationName); } }
5、創建CameraFollow腳本,把它掛載到Main Camera上。它的作用是:1、讓Main Camera跟隨第三人稱控制器移動;2、改變Main Camera視角;3、控制Main Camera與第三人稱控制器的距離。
using UnityEngine; using System.Collections; public class CameraFollow : MonoBehaviour { private Vector3 followPos;//用來保存攝像機和游戲主角的相對位置 private GameObject player; public float scrollSpeed = 10;//攝像機拉近的速度 private bool isRotating = false;//判斷鼠標右鍵是否按下 public float rotateSpeed = 2;//攝像機左右旋轉的速度 private float distance;//保存攝像機和游戲主角距離 // Use this for initialization void Start() { player = GameObject.FindGameObjectWithTag("Player"); followPos = player.transform.position - this.transform.position; this.transform.LookAt(player.transform.position); } // Update is called once per frame void Update() { Follow(); RotateView(); ScrollView(); } //使攝像機跟隨游戲主角運動 void Follow() { this.transform.position = player.transform.position - followPos; } //滑動鼠標滑輪的時候可以改變攝像機與游戲主角的距離 void ScrollView() { distance = followPos.magnitude; distance += Input.GetAxis("Mouse ScrollWheel"); distance=Mathf.Clamp(distance,2,18); followPos = followPos.normalized * distance; } //按下鼠標右鍵的時候移動鼠標可以改變攝像機的視角 void RotateView() { if(Input.GetMouseButtonDown(1)) { isRotating = true; } else if(Input.GetMouseButtonUp(1)) { isRotating = false; } if(isRotating) { this.transform.RotateAround(player.transform.position, player.transform.up, rotateSpeed * Input.GetAxis("Mouse X")); Vector3 originalPos = this.transform.position; Quaternion originalRotation = this.transform.rotation; this.transform.RotateAround(player.transform.position, this.transform.right, -rotateSpeed * Input.GetAxis("Mouse Y")); float x = this.transform.eulerAngles.x; print(x); //限制攝像機旋轉的最大,最小位置 if(x<10||x>70) { this.transform.position = originalPos; this.transform.rotation = originalRotation; } } followPos = player.transform.position - this.transform.position; } }
6、完成以后的效果,錄屏鼠標看不見了,抱歉了。