• unity 限制 相机移动 区域(无需碰撞检测)


    限制功能原著地址:unity限制相机可移动区域(box collider)_unity限制相机移动区域_manson-liao的博客-CSDN博客

    一、创建限制区域

    创建一个Cube,Scale大小=1,添加组件:BoxCollder,调整BoxCollder的Size(此为限制区域)

    二、代码(功能:WADS(或者上下左右方向键)以及使用Q E上升下降移动和鼠标等控制相机的移动转向等,限制功能是类里的方法为:limitation(),放在Update里执行即可)

    1. /**********************************************************************
    2. 文件信息
    3. 文件名(File Name): CameraController03.cs
    4. 作者(Author): TianWenQuan
    5. 创建时间(CreateTime): #CREATETIME#
    6. Unity版本(UnityVersion): #UNITYVERSION#
    7. 项目:三峡库区消落带植物群落组成及其对水位变化的响应虚拟仿真实验
    8. **********************************************************************/
    9. using System.Collections;
    10. using System.Collections.Generic;
    11. using UnityEngine;
    12. using UnityEngine.UI;
    13. using UnityEngine.EventSystems;
    14. namespace Twq
    15. {
    16. /// <summary>
    17. /// wasd控制 (使用中)
    18. /// </summary>
    19. public class CameraController03 : MonoBehaviour
    20. {
    21. public static CameraController03 Instance;
    22. [Header("模型")]
    23. public Transform targetmodel;
    24. public static Transform target;
    25. [Header("鼠标滚轮灵敏度")]
    26. [SerializeField]
    27. private int MouseWheelSensitivity = 2;
    28. [Header("最近距离")]
    29. [SerializeField]
    30. public int MouseZoomMin = 750;
    31. [Header("最远距离")]
    32. [SerializeField]
    33. public int MouseZoomMax = 2000;
    34. [Header("水平旋转速度")]
    35. [SerializeField]
    36. private float xSpeed = 150.0f;
    37. [Header("竖直旋转速度")]
    38. [SerializeField]
    39. private float ySpeed = 80.0f;
    40. [Header("鼠标移动灵敏度")]
    41. [SerializeField]
    42. private float mouseMoveSensitivity = 3.0f;
    43. [Header("角度限制")]
    44. [SerializeField]
    45. private int yMinLimit = 0;
    46. [SerializeField]
    47. private int yMaxLimit = 89;
    48. [Header("摄像机初始角度")]
    49. [SerializeField]
    50. private float xRot = 0;
    51. [SerializeField]
    52. private float yRot = 0;
    53. [Header("摄像机位置")]
    54. [SerializeField]
    55. private Vector3 camPos;//= new Vector3(0, 0, 0);
    56. public float normalDistance;//初始摄像机距离,无法在面板显示
    57. public static float x;//= 69f;
    58. public static float y;// 34.2f;
    59. private Quaternion rotation;
    60. public static Vector3 CameraTarget;
    61. // [HideInInspector]
    62. public bool isExit;//打开 控制相机
    63. public bool isShuBiao;//Flase=拉近 状态
    64. public Transform SelfTransform;
    65. private void Awake()
    66. {
    67. Instance = this;
    68. SelfTransform = this.transform;
    69. }
    70. void Start()
    71. {
    72. //初始化
    73. isExit = true;
    74. isShuBiao = true;
    75. x = yRot;
    76. y = xRot;
    77. target = targetmodel;
    78. Vector3 posC = camPos - target.position;
    79. normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
    80. rotation = Quaternion.Euler(new Vector3(y, x, 0f));
    81. transform.rotation = rotation;
    82. float z = target.transform.position.z - normalDistance;
    83. transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
    84. CameraTarget = transform.position + transform.forward.normalized * normalDistance;
    85. x = transform.localEulerAngles.x;
    86. y = transform.localEulerAngles.y;
    87. }
    88. public void Init()
    89. {
    90. isExit = true;
    91. isShuBiao = true;
    92. Vector3 posC = camPos - target.position;
    93. normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));
    94. rotation = Quaternion.Euler(new Vector3(90f, 0f, 0f));
    95. transform.rotation = rotation;
    96. transform.position = new Vector3(0f, 0f, 0f);
    97. CameraTarget = transform.position + transform.forward.normalized * normalDistance;
    98. x = transform.localEulerAngles.x;
    99. y = transform.localEulerAngles.y;
    100. }
    101. public float movespeed = 500;
    102. void LateUpdate()
    103. {
    104. if (IsPointerOverGameObject(Input.mousePosition))
    105. if (isExit)
    106. {
    107. if (isShuBiao)
    108. {
    109. // 定义3个值控制移动
    110. float xm = 0, zm = 0;
    111. if (Input.GetKey(KeyCode.Q)) //上升
    112. {
    113. if (transform.position.y >= MouseZoomMax)//限制 最大距离
    114. {
    115. transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);
    116. }
    117. else
    118. {
    119. transform.position = new Vector3(transform.position.x, transform.position.y +movespeed * Time.deltaTime, transform.position.z);
    120. }
    121. }
    122. else if ( Input.GetKey(KeyCode.E))//下降
    123. {
    124. if (transform.position.y <= MouseZoomMin)//限制 最小距离
    125. {
    126. transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);
    127. }
    128. else
    129. {
    130. transform.position = new Vector3(transform.position.x, transform.position.y - movespeed * Time.deltaTime, transform.position.z);
    131. }
    132. }
    133. //按键盘W向上移动
    134. if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
    135. {
    136. this.transform.Translate(Vector3.forward * movespeed * Time.deltaTime);
    137. //if (transform.position.y < MouseZoomMin)//限制 最小距离
    138. //{
    139. // transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);
    140. //}
    141. //else
    142. //{
    143. // this.transform.Translate(Vector3.forward * movespeed * Time.deltaTime);
    144. //}
    145. }
    146. else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))//按键盘S向下移动
    147. {
    148. //if (transform.position.y > MouseZoomMax)//限制 最大距离
    149. //{
    150. // transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);
    151. //}
    152. //else
    153. //{
    154. // this.transform.Translate(Vector3.back * movespeed * Time.deltaTime);
    155. //}
    156. this.transform.Translate(Vector3.back * movespeed * Time.deltaTime);
    157. }
    158. if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))//按键盘A向左移动
    159. {
    160. // xm -= 500 * Time.deltaTime;
    161. this.transform.Translate(Vector3.left * movespeed * Time.deltaTime);
    162. }
    163. else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))//按键盘D向右移动
    164. {
    165. // xm += 500 * Time.deltaTime;
    166. this.transform.Translate(Vector3.right * movespeed * Time.deltaTime);
    167. }
    168. if (Input.GetMouseButton(GlobalVariableManage.GetMouseButtonType))// 1鼠标右键 0鼠标左键
    169. {
    170. y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
    171. x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
    172. x = ClampAngle(x, yMinLimit, yMaxLimit);
    173. var rotation = Quaternion.Euler(x, y, 0);
    174. transform.rotation = rotation;
    175. }
    176. else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
    177. {
    178. // normalized = (transform.position - CameraTarget).normalized;
    179. if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
    180. {
    181. this.transform.position += this.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
    182. Vector3 p = this.transform.position - CameraTarget;
    183. normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
    184. }
    185. if (normalDistance < MouseZoomMin)
    186. {
    187. normalDistance = MouseZoomMin;
    188. }
    189. if (normalDistance > MouseZoomMax)
    190. {
    191. normalDistance = MouseZoomMax;
    192. }
    193. if (transform.position.y < MouseZoomMin)//限制 最小距离
    194. {
    195. transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);
    196. }
    197. if (transform.position.y > MouseZoomMax)//限制 最大距离
    198. {
    199. transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);
    200. }
    201. }
    202. }
    203. else
    204. {
    205. if (transform.position.y > MouseZoomMax)//限制 最小距离
    206. {
    207. isShuBiao = true;
    208. }
    209. //缩放
    210. if (Input.GetAxis("Mouse ScrollWheel") > 0)
    211. {
    212. transform.Translate(Vector3.forward * 100f);//速度可调 自行调整
    213. }
    214. if (Input.GetAxis("Mouse ScrollWheel") < 0)
    215. {
    216. transform.Translate(Vector3.forward * -100f);//速度可调 自行调整
    217. }
    218. //旋转
    219. x = transform.localEulerAngles.x;
    220. y = transform.localEulerAngles.y;
    221. }
    222. limitation();
    223. }
    224. }
    225. public GameObject box;
    226. private void limitation()
    227. {
    228. if (box)
    229. {
    230. Vector3 boxSize = box.GetComponent<BoxCollider>().size;
    231. Vector3 boxCenter = box.GetComponent<BoxCollider>().center;
    232. Vector3 min = box.transform.position + boxCenter - boxSize * 0.5f;
    233. Vector3 max = box.transform.position + boxCenter + boxSize * 0.5f;
    234. Vector3 cameraP = transform.position;
    235. //Debug.Log("min.x="+ min.x+ " max.x="+ max.x);
    236. if (cameraP.x < min.x)
    237. {
    238. cameraP.x = min.x;
    239. }
    240. else if (cameraP.x > max.x)
    241. {
    242. cameraP.x = max.x;
    243. }
    244. if (cameraP.y < min.y)
    245. {
    246. cameraP.y = min.y;
    247. }
    248. else if (cameraP.y > max.y)
    249. {
    250. cameraP.y = max.y;
    251. }
    252. if (cameraP.z < min.z)
    253. {
    254. cameraP.z = min.z;
    255. }
    256. else if (cameraP.z > max.z)
    257. {
    258. cameraP.z = max.z;
    259. }
    260. transform.position = cameraP;
    261. }
    262. }
    263. /// <summary>
    264. /// 检测是否点击UI
    265. /// </summary>
    266. /// <param name="mousePosition">鼠标位置</param>
    267. /// <returns></returns>
    268. private bool IsPointerOverGameObject(Vector2 mousePosition)
    269. {
    270. //创建一个点击事件
    271. PointerEventData eventData = new PointerEventData(EventSystem.current);
    272. eventData.position = mousePosition;
    273. List<RaycastResult> raycastResults = new List<RaycastResult>();
    274. //向点击位置发射一条射线,检测是否点击UI
    275. EventSystem.current.RaycastAll(eventData, raycastResults);
    276. if (raycastResults.Count > 0)//大于0 说明 有UI
    277. {
    278. return false;
    279. }
    280. else
    281. {
    282. return true;
    283. }
    284. }
    285. static float ClampAngle(float angle, float min, float max)
    286. {
    287. if (angle < -360)
    288. angle += 360;
    289. if (angle > 360)
    290. angle -= 360;
    291. return Mathf.Clamp(angle, min, max);
    292. }
    293. //--------------------围绕的物体并且 相机定位物体-------------------//
    294. #region
    295. //public Transform CenObj;//围绕的物体
    296. //private Vector3 Rotion_Transform;
    297. //private new Camera camera;
    298. bool bo;
    299. //private Transform mainCameraTr; //主摄像机
    300. //public Transform lookAtTarget; //摄像机看向的目标
    301. //private float cameraDistance = 50.0F; //摄像机与看向目标的距离
    302. //private float cameraHeight = 800.0F; //摄像机高度
    303. //private float cmaeraOffset = 1000.0F; //摄像机的偏移
    304. //private float mainCameraMoveSpeed = 1F; //主摄像机移动的速度
    305. //private Vector3 lookAtTargetPosition; //看向目标时的位置
    306. //private Quaternion lookAtTargetRotation; //看向目标,且旋转
    307. //public bool isLookAtAppointTarget = false; //是否看向指定的物体
    308. //public void SetInit(Transform CenObj_)
    309. //{
    310. // Debug.Log("点击了=" + CenObj_.name);
    311. // isShuBiao = true;
    312. // CenObj = CenObj_;
    313. // Rotion_Transform = CenObj.position;
    314. // lookAtTarget = CenObj_;
    315. // LookAtAppointTarget();
    316. // isShuBiao = false;
    317. //}
    318. //void Update()
    319. //{
    320. // //if (!isExit)
    321. // //{
    322. // // Ctrl_Cam_Move();
    323. // // Cam_Ctrl_Rotation();
    324. // //}
    325. //}
    326. / <summary>
    327. / 摄像机看向指定物体的方法
    328. / </summary>
    329. //public void LookAtAppointTarget()
    330. //{
    331. // if (lookAtTarget != null)
    332. // {
    333. // lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,
    334. // lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
    335. // isLookAtAppointTarget = true;
    336. // }
    337. // else
    338. // {
    339. // Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
    340. // }
    341. // if (isLookAtAppointTarget == true)//是否看向物体
    342. // {
    343. // mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);
    344. // mainCameraTr.LookAt(lookAtTarget);
    345. // }
    346. // //if (isBack == true)
    347. // //{
    348. // // mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);
    349. // //}
    350. //}
    351. #endregion
    352. }
    353. }

  • 相关阅读:
    攻防世界----bug
    Linux篇 四、Linux修改用户名
    爬虫ip如何加入到代码里实现自动化数据抓取
    Java基础之《netty(4)—NIO之Channel》
    005 OpenCV直方图
    django-rest-framework 基础二 序列化器和路由
    JavaScript如何拦截全局Fetch的请求和响应
    C语言拍品管理系统
    IO-Link通信RFID读卡器|传感器在汽车差速器组装线上的应用方案
    Unity基础课程之物理引擎3-碰撞检测案例-吃金币并加分显在UI文本框上
  • 原文地址:https://blog.csdn.net/qq_37524903/article/details/133349666