using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Cameracontroller : MonoBehaviour { public float mouseSpeed=0.05f; public float rotateSpeed=100; public float scrollwheelSpeed=200; public float moveSpeed=0.1f; public float lerpSpeed = 0.5f; public float lookSpeed=6; Vector3 mousePos; public static Action<GameObject> selectTower; public static Action<GameObject> exitSelectTower; [HideInInspector] public GameObject currSelectObj; void LateUpdate() { MoveRotation(); DragMove(); ScrollMove(); CheckTower(); MoveToTower(); RotateToTower(); } /// <summary> /// 鼠标右键控制移动旋转 /// </summary> private void MoveRotation() { if (Input.GetKeyDown(KeyCode.Mouse1)) { ResetTower(); } if (Input.GetKey(KeyCode.Mouse1)) { float mouseX = Input.GetAxis("Mouse X"); float mouseY = Input.GetAxis("Mouse Y"); transform.Rotate(Vector3.up, Time.deltaTime * mouseX * rotateSpeed, Space.World); transform.Rotate(transform.right, -Time.deltaTime * mouseY * rotateSpeed, Space.World); Vector2 input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); Vector3 ms = new Vector3(input.x, 0, input.y) * moveSpeed; transform.Translate(ms, Space.Self); } } /// <summary> /// 拖拽中键移动 /// </summary> private void DragMove() { if (Input.GetKeyDown(KeyCode.Mouse2)) { ResetTower(); mousePos = Input.mousePosition; } if (Input.GetKey(KeyCode.Mouse2)) { Vector3 deltPos = Input.mousePosition - mousePos; deltPos = -deltPos; transform.Translate(deltPos * 0.1f, Space.Self); mousePos = Input.mousePosition; } } /// <summary> /// 滚动中键移动 /// </summary> private void ScrollMove() { float scrollwhell = Input.GetAxis("Mouse ScrollWheel"); transform.Translate(Vector3.forward * Time.deltaTime * scrollwhell * scrollwheelSpeed); } /// <summary> /// 选择塔 /// </summary> private void CheckTower() { RaycastHit hit = default(RaycastHit); if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 1000)) { if (Input.GetKeyUp(KeyCode.Mouse0)) { if (hit.collider.tag == "TowerBase") { currSelectObj = hit.collider.gameObject; if (selectTower != null) { selectTower(currSelectObj); } toMove = true; toRot = true; } } } } /// <summary> /// 移动到塔 /// </summary> bool toMove = false; private void MoveToTower() { if (!toMove) return; transform.position = Vector3.Lerp(transform.position, currSelectObj.transform.position, Time.deltaTime* lerpSpeed); if (Vector3.Distance(currSelectObj.transform.position, transform.position)<10) toMove = false; } /// <summary> /// 选择向塔 /// </summary> bool toRot = false; private void RotateToTower() { if (!toRot) return; Quaternion lookAt = Quaternion.LookRotation((currSelectObj.transform.position - transform.position).normalized); transform.rotation = Quaternion.Lerp(transform.rotation, lookAt, Time.deltaTime * lerpSpeed * 6); float angle = Quaternion.Angle(transform.rotation, lookAt); if (angle<1) toRot = false; } /// <summary> /// 设置选择塔为null /// </summary> /// <param name="go"></param> public void ResetTower() { if (exitSelectTower != null) exitSelectTower(currSelectObj); currSelectObj = null; } }