using System; using System.Collections.Generic; using System.Linq; using UnityEngine; public class AgentController : MonoBehaviour { [SerializeField] public GameObject commonParameterContainerObj; [SerializeField] public Camera fpsCam; [Header("GetAxis() Simulate")] public float moveSpeed = 9.0f; public float vX = 0f; public float vZ = 0f; public Vector3 nowMovement; public float acceleration = 0.9f; // 加速度 public float mouseXSensitivity = 100; public float mouseYSensitivity = 200; public float yRotation = 0.1f;//定义一个浮点类型的量,记录‘围绕’X轴旋转的角度 private bool lockMouse; private float fireRate; private bool lockCameraX; private bool lockCameraY; // environment public float lastShootTime = 0.0f; public int enemyKillCount = 0; public Vector3 killEnemyPosition; public bool defaultTPCamera = true; [System.NonSerialized] public bool gunReadyToggle = true; public string myTag = ""; private CharacterController playerController; private CommonParameterContainer commonPramCon; private void Start() { // initialize scripts commonPramCon = commonParameterContainerObj.GetComponent(); playerController = transform.GetComponent(); // initialize Environment parameters lockMouse = commonPramCon.lockMouse; fireRate = commonPramCon.fireRate; lockCameraX = commonPramCon.lockCameraX; lockCameraY = commonPramCon.lockCameraY; // initialize remainTime // this agent's tag myTag = gameObject.tag; } #region Agent Move Control public void MoveAgent(int vertical, int horizontal) { // Vector3 nowMovement; if (horizontal != 0)//当按下按键(水平方向) { if (vX < moveSpeed && vX > -moveSpeed)//当前速度小于最大速度 { vX += (float)horizontal * acceleration;//增加加速度 } else { //防止在一瞬间切换输入时速度仍保持不变 if ((vX * horizontal) > 0)//输入与当前速度方向同向 { vX = (float)horizontal * moveSpeed; //限制最大速度 } else { vX += (float)horizontal * acceleration;//增加加速度 } } } else { if (Math.Abs(vX) > 0.001) { vX -= (vX / Math.Abs(vX)) * acceleration;//减少加速度 } else { vX = 0; } } if (vertical != 0)//当按下按键(垂直方向) { if (vZ < moveSpeed && vZ > -moveSpeed)//当前速度小于最大速度 { vZ += (float)vertical * acceleration;//增加加速度 } else { if ((vZ * vertical) > 0)//输入与当前速度方向同向 { vZ = (float)vertical * moveSpeed; //限制最大速度 } else { vZ += (float)vertical * acceleration;//增加加速度 } } } else { if (Math.Abs(vZ) > 0.001) { vZ -= (vZ / Math.Abs(vZ)) * acceleration;//减少加速度 } else { vZ = 0; } } nowMovement = (transform.forward * vZ + transform.right * vX); //PlayerController下的.Move为实现物体运动的函数 //Move()括号内放入一个Vector3类型的量,本例中为Player_Move if (nowMovement.magnitude > moveSpeed) { nowMovement = nowMovement.normalized * moveSpeed; } playerController.Move(nowMovement * Time.deltaTime); // update Key Viewer } #endregion Agent Move Control #region Camera Control public void CameraControl(float Mouse_X, float Mouse_Y) { //Mouse_X = Input.GetAxis("Mouse X") * MouseSensitivity * Time.deltaTime; //Debug.Log(Input.GetAxis("Mouse X")); //Mouse_Y = Input.GetAxis("Mouse Y") * MouseSensitivity * Time.deltaTime; if (lockCameraX) { Mouse_X = 0; } if (lockCameraY) { Mouse_Y = 0; } yRotation = yRotation - Mouse_Y; //xRotation值为正时,屏幕下移,当xRotation值为负时,屏幕上移 //当鼠标向上滑动,Mouse_Y值为正,xRotation-Mouse_Y的值为负,xRotation总的值为负,屏幕视角向上滑动 //当鼠标向下滑动,Mouse_Y值为负,xRotation-Mouse_Y的值为正,xRotation总的值为正,屏幕视角向下滑动 //简单来说就是要控制鼠标滑动的方向与屏幕移动的方向要相同 //limit UP DOWN between -90 -> 90 yRotation = Mathf.Clamp(yRotation, -90f, 90f); //相机左右旋转时,是以Y轴为中心旋转的,上下旋转时,是以X轴为中心旋转的 transform.Rotate(Vector3.up * Mouse_X); //Vector3.up相当于Vector3(0,1,0),CameraRotation.Rotate(Vector3.up * Mouse_X)相当于使CameraRotation对象绕y轴旋转Mouse_X个单位 //即相机左右旋转时,是以Y轴为中心旋转的,此时Mouse_X控制着值的大小 //相机在上下旋转移动时,相机方向不会随着移动,类似于低头和抬头,左右移动时,相机方向会随着向左向右移动,类似于向左向右看 //所以在控制相机向左向右旋转时,要保证和父物体一起转动 fpsCam.transform.localRotation = Quaternion.Euler(yRotation, 0, 0); //this.transform指这个CameraRotation的位置,localRotation指的是旋转轴 //transform.localRotation = Quaternion.Eular(x,y,z)控制旋转的时候,按照X-Y-Z轴的旋转顺规 //即以围绕X轴旋转x度,围绕Y轴旋转y度,围绕Z轴旋转z度 //且绕轴旋转的坐标轴是父节点本地坐标系的坐标轴 } #endregion Camera Control // Got Kill point public void KillRecord(Vector3 killEnemyPosition) { enemyKillCount += 1; this.killEnemyPosition = killEnemyPosition; } public void UpdateLockMouse() { // lock mouse based on paramContainer lockMouse if (lockMouse) { Cursor.lockState = CursorLockMode.Locked; } } public void UpdateGunState() { // update gun state if ((Time.time - lastShootTime) >= fireRate) { gunReadyToggle = true; } else { gunReadyToggle = false; } } }