相机控制类
来源:互联网 发布:火影忍者阿飞知乎 编辑:程序博客网 时间:2024/05/20 06:31
分享一个相机控制类
操作:左键拖动、右键旋转、滚轮远近
说明:
1、该类完全是控制相机,对物体没有影响,左键拖动改的是相机的移动,右键选择改的也是相机,旋转是沿着鼠标点击点为中心
操作:左键拖动、右键旋转、滚轮远近
说明:
1、该类完全是控制相机,对物体没有影响,左键拖动改的是相机的移动,右键选择改的也是相机,旋转是沿着鼠标点击点为中心
2、场景中建两个空物体,置零,分别拖拽到类的公有变量target和forwardPoint上,该类拖到相机上即可。
using UnityEngine;using System.Collections;using UnityEngine.EventSystems;using DG.Tweening; public class MoveCamra : MonoBehaviour { static MoveCamra _instance; public static MoveCamra Instance { get { return _instance; } } /// <summary> /// 移动速度 /// </summary> public float moveSpeed = 3; private Ray mouseRay; private bool mouseChick = true; private float firstTime = 0; //private bool isOpenCamMove=false; private float rotationSpeed = 5F; /// <summary> /// 最小高度 /// </summary> private float minY = -1000F; /// <summary> /// 最大高度 /// </summary> private float maxY = 1000F; /// <summary> /// 移动跟随物体(初始坐标旋转角度为0的空物体) /// </summary> public GameObject forwardPoint; /// <summary> /// 绕着旋转的中心点(初始坐标旋转角度为0) /// </summary> public GameObject target; /// <summary> /// 是否开启鼠标旋转 /// </summary> private bool isRotating = false; /// <summary> /// 相机和目标物体的距离 /// </summary> private Vector3 offsetPosition; //是否聚焦在建筑上 bool focusState = false; //聚焦建筑物 Transform focusObj; void Awake() { _instance = this; } // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (!IsTouchedUI()) { MouseMove(); KeyMove(); } } void LateUpdate() { if (transform.parent != null) { transform.parent = null; forwardPoint.transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z); } ///限制移动高度和低度 transform.position = new Vector3(transform.position.x, Mathf.Clamp(transform.position.y, minY, maxY + 6f), transform.position.z); } private void KeyMove() { if (Input.GetKeyDown(KeyCode.Space)) { ///复位到初始位置和角度 } if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) { moveSpeed = 2; rotationSpeed = 2F; } else if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift)) { moveSpeed = 5f; rotationSpeed = 5F; } //判定是否按住了ctrl,如果按住了,则使用最大移动速度,否则使用正常移动速度 if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) { moveSpeed = 15; } else if (Input.GetKeyUp(KeyCode.LeftControl) || Input.GetKeyUp(KeyCode.RightControl)) { moveSpeed = 5; } if (Input.GetKeyDown(KeyCode.W)) { MoveCmer(Vector3.forward, KeyCode.W); } else if (Input.GetKeyDown(KeyCode.S)) { MoveCmer(Vector3.back, KeyCode.S); } if (Input.GetKeyDown(KeyCode.A)) { MoveCmer(Vector3.left, KeyCode.A); } else if (Input.GetKeyDown(KeyCode.D)) { MoveCmer(Vector3.right, KeyCode.D); } else if (Input.GetKey(KeyCode.Q)) { RotCamera(5); } else if (Input.GetKey(KeyCode.E)) { RotCamera(-5); } else if (Input.GetKeyDown(KeyCode.UpArrow)) { MoveCmer(Vector3.up, KeyCode.UpArrow); } else if (Input.GetKeyDown(KeyCode.DownArrow)) { MoveCmer(Vector3.down, KeyCode.DownArrow); } else if (Input.GetKey(KeyCode.LeftArrow)) { CameraRotation(Vector3.down); } else if (Input.GetKey(KeyCode.RightArrow)) { CameraRotation(Vector3.up); } } /// <summary> /// 旋转相机 /// </summary> private void RotateView() { //鼠标右键按下可以旋转视野 if (Input.GetMouseButtonDown(1)) { Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit) && focusState == false) { target.transform.position = hit.point; } else { target.transform.position = focusObj.position; } isRotating = true; } if (Input.GetMouseButtonUp(1)) isRotating = false; if (isRotating) { Vector3 originalPosition = transform.position; Quaternion originalRotation = transform.rotation; transform.RotateAround(target.transform.position, target.transform.up, rotationSpeed * Input.GetAxis("Mouse X")); transform.RotateAround(target.transform.position, transform.right, -rotationSpeed * Input.GetAxis("Mouse Y")); float x = transform.eulerAngles.x; //旋转的范围为 if (x > 80 && x < 330) { transform.position = originalPosition; transform.rotation = originalRotation; } } offsetPosition = transform.position - target.transform.position; } public void CameraRotation(Vector3 direction) { transform.Rotate(direction * rotationSpeed, Space.World); } /// <summary> /// 移动相机开启携程 /// </summary> /// <param name="v"></param> /// <param name="key"></param> private void MoveCmer(Vector3 v, KeyCode key) { StartCoroutine(TurnRound(v, key)); } /// <summary> /// 移动相机 /// </summary> /// <param name="v">方向</param> /// <param name="key">按键</param> /// <returns></returns> private IEnumerator TurnRound(Vector3 v, KeyCode key) { bool isPress = true; while (isPress && Input.GetKey(key)) { Move(v); yield return new WaitForFixedUpdate(); if (Input.GetKeyUp(key)) { isPress = false; } } } /// <summary> /// 移动相机通过子父物体关系移动 /// </summary> /// <param name="direction"></param> private void Move(Vector3 direction) { transform.parent = forwardPoint.transform; forwardPoint.transform.Translate(direction * moveSpeed); } /// <summary> /// 限制相机上下旋转角度 /// </summary> /// <param name="speed"></param> private void RotCamera(float speed) { transform.localEulerAngles -= new Vector3(rotationSpeed / speed, 0, 0); if (transform.localEulerAngles.x > 85) transform.localEulerAngles = new Vector3(85, transform.eulerAngles.y, transform.eulerAngles.z); if (transform.localEulerAngles.x < 10) transform.localEulerAngles = new Vector3(10, transform.eulerAngles.y, transform.eulerAngles.z); } /// <summary> /// 鼠标控制 /// </summary> void MouseMove() { if (!Input.GetMouseButtonDown(2)) { if (Input.GetAxis("Mouse ScrollWheel") != 0) { transform.Translate(Vector3.forward * Input.GetAxis("Mouse ScrollWheel") * moveSpeed * Ray(transform) * 0.1f); //Debug.Log("速度:"+moveSpeed * Ray(transform) * 0.1f); } } if (Input.GetMouseButton(0) && focusState == false) { transform.parent = forwardPoint.transform; forwardPoint.transform.Translate(-Input.GetAxis("Mouse X") * Ray(transform) * 0.02f * moveSpeed, 0, -Input.GetAxis("Mouse Y") * Ray(transform) * 0.02f * moveSpeed); } if (Input.GetMouseButtonDown(0))// { mouseRay = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);//从摄像机向鼠标点击的位置发射条射线 RaycastHit hit; //双击左键定位 if (Physics.Raycast(mouseRay, out hit))//当射线碰撞到对象时 { if (Time.time - firstTime > 0.3f) { mouseChick = true; } if (mouseChick) { firstTime = Time.time; } else { if (Time.time - firstTime <= 0.3f) { if (Vector3.Distance(transform.position, hit.point) >= 5) { //双击定位到物体附近 if(hit.collider.tag == "house") { StartCoroutine(FrontTowardPoint(hit.collider.transform.parent.parent.parent)); } else { transform.DOMove(GetBetweenPoint(hit.point, transform.position, 40), 1); } } } } mouseChick = !mouseChick; } } RotateView(); } /// <summary> /// 返回两点之间distance距离的点 /// </summary> /// <param name="start">开始的点</param> /// <param name="end">终点</param> /// <param name="distance">距离</param> /// <returns></returns> private Vector3 GetBetweenPoint(Vector3 start, Vector3 end, float distance) { Vector3 normal = (end - start).normalized; return normal * distance + start; } /// <summary> /// 朝向建筑的点 /// </summary> /// <returns></returns> IEnumerator FrontTowardPoint(Transform TargetPoint) { focusObj = TargetPoint; focusState = true; Sequence mySequence = DOTween.Sequence(); mySequence.Append(transform.DOMove(TargetPoint.position + new Vector3(0, 10, 10), 1f)); mySequence.Append(transform.DOLookAt(TargetPoint.position, 0.7f)); yield return new WaitForSeconds(1.7f); //开始实例化UI界面 print("开始实例化UI界面"); } /// <summary> /// 判断相机和前方焦点的距离 /// </summary> /// <param name="point"></param> /// <returns>返回距离</returns> private float Ray(Transform point) { Vector3 p = Vector3.zero; RaycastHit hit; if (Physics.Raycast(point.position, point.forward, out hit)) { p = hit.point; } float dis = Vector3.Distance(point.transform.position, p); if (dis >= 300) dis = 300; if (dis <= 6) dis = 6; return dis; } //是否在UI上 bool IsTouchedUI() { bool touchedUI = false; if (Application.isMobilePlatform) { if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { touchedUI = true; } } else if (EventSystem.current.IsPointerOverGameObject()) { touchedUI = true; } return touchedUI; }}
阅读全文
0 0
- 相机控制类
- 3D相机控制
- Unity 相机控制集合。。。。
- vtk相机控制
- Unity3D 相机控制
- 相机视野控制效果
- 控制相机拍照
- OpenGL相机控制
- Three.js控制相机
- 添加相机控制
- VTK: 相机参数控制
- 正交相机视野控制
- Controlling the Camera 控制相机
- 相机视野控制效果实现
- Android开发之控制相机
- Unity相机控制小技巧
- 多媒体应用之控制相机
- 关于Unity3d代码控制相机的cullingmask
- C#dictionary 构造
- Angular入门(二)快速入门
- mybatis分页(PageHelper)
- 旷视Face++回清华求教AI本质创新,姚期智授2锦囊,出任首席顾问
- Socket蓝牙传输
- 相机控制类
- 软件工程(C编码实践篇)学习总结
- 153. Find Minimum in Rotated Sorted Array
- 在线生成小程序码,微信生成带参数小程序码
- Cordova插件CordovaPlugin包名问题
- 不可描述⁄( ⁄•⁄ω⁄•⁄ )⁄!亚马逊用机器学习找有声书中情色片段
- Python分割字符串
- Docker中YUM安装RPM包报错 Rpmdb checksum is invalid: dCDPT(pkg checksums): ...
- 刘强东解读京东AI战略布局,沈南鹏高文杨强助阵谈AI机遇