请选择 进入手机版 | 继续访问电脑版

[C#教程] unity实现方向盘转动效果

[复制链接]
查看104 | 回复3 | 2021-9-14 10:42:08 | 显示全部楼层 |阅读模式

本文实例为大家分享了unity实现方向盘转动结果 的具体 代码,供大家参考,具体 内容如下

结果

手指或鼠标拖动方向回旋 转,有角度限定 ,放手 后自动 回转。

unity实现方向盘转动效果

代码

将代码添加到方向盘Image上。

留意 必要 赋值Canvas。

  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. public class SteeringWheel : MonoBehaviour,IDragHandler,IEndDragHandler
  4. {
  5. public Canvas CanvasRoot;//需要指定画布
  6. private RectTransform m_RectTransform;//坐标
  7. private bool m_IsFirst = true; //用于记录第一帧按下鼠标时鼠标的位置,便于计算
  8. private Vector3 m_CurrentPos; //记录当前帧鼠标所在位置
  9. private bool m_IsClockwise; //是否顺时针
  10. private float m_RoundValue = 0; //记录总的旋转角度 用这个数值来控制一圈半
  11. private bool m_IsTuringSteeringWheel; //是否在转方向盘 用这个判断复位
  12. public void OnDrag(PointerEventData eventData)
  13. {
  14. m_IsTuringSteeringWheel = true;
  15. Vector2 pos;
  16. if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_RectTransform, Input.mousePosition, CanvasRoot.worldCamera, out pos)) //获取鼠标点击位置
  17. {
  18. pos.x = pos.x + (Screen.width / 2) - GetComponent<RectTransform>().position.x;
  19. pos.y = pos.y + (Screen.height / 2) - GetComponent<RectTransform>().position.y;
  20. Vector3 pos3 = new Vector3(pos.x, pos.y, 0); //计算后鼠标以方向盘圆心为坐标原点的坐标位置
  21. if (m_IsFirst)
  22. {
  23. m_CurrentPos = pos3;
  24. m_IsFirst = false;
  25. }
  26. Vector3 currentPos = Vector3.Cross(pos3, m_CurrentPos); //计算当前帧和上一帧手指位置 用于判断旋转方向
  27. if (currentPos.z > 0)
  28. {
  29. m_IsClockwise = true;
  30. }
  31. else if (currentPos.z < 0)
  32. {
  33. m_IsClockwise = false;
  34. }
  35. if (m_CurrentPos != pos3) //范围内让方向盘随着手指转动
  36. {
  37. if (m_IsClockwise)
  38. {
  39. if (m_RoundValue <= 180)
  40. {
  41. m_RoundValue += Vector3.Angle(m_CurrentPos, pos3);
  42. transform.Rotate(new Vector3(0, 0, -Vector3.Angle(m_CurrentPos, pos3)));
  43. }
  44. }
  45. else
  46. {
  47. if (m_RoundValue >= -180)
  48. {
  49. m_RoundValue -= Vector3.Angle(m_CurrentPos, pos3);
  50. transform.Rotate(new Vector3(0, 0, Vector3.Angle(m_CurrentPos, pos3)));
  51. }
  52. }
  53. }
  54. m_CurrentPos = pos3;
  55. }
  56. }
  57. public void OnEndDrag(PointerEventData eventData)
  58. {
  59. m_IsFirst = true;
  60. m_IsTuringSteeringWheel = false;
  61. }
  62. void Start()
  63. {
  64. CanvasRoot = GameObject.Find("Canvas").GetComponent<Canvas>();
  65. m_RectTransform = CanvasRoot.transform as RectTransform;
  66. }
  67. void Update()
  68. {
  69. if (!m_IsTuringSteeringWheel && m_RoundValue != 0) //复位
  70. {
  71. if (m_RoundValue >= 0)
  72. {
  73. m_RoundValue -= 8f; //复位速度
  74. if (m_RoundValue < 0)
  75. m_RoundValue = 0;
  76. transform.rotation = Quaternion.Euler(new Vector3(0, 0, -m_RoundValue));
  77. }
  78. else
  79. {
  80. m_RoundValue += 8f;
  81. if (m_RoundValue > 0)
  82. m_RoundValue = 0;
  83. transform.rotation = Quaternion.Euler(new Vector3(0, 0, -m_RoundValue));
  84. }
  85. }
  86. }
  87. }
复制代码

以上就是本文的全部内容,盼望 对大家的学习有所帮助,也盼望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 东阿制造 | 2021-9-19 06:45:41 | 显示全部楼层
admin楼主主机很热情啊!
回复

使用道具 举报

avatar 喜欢吃芒果干俺 | 2021-9-25 15:29:31 | 显示全部楼层
林子大了,什么鸟都有了啊!
回复

使用道具 举报

avatar 123457067 | 2021-10-14 13:10:59 | 显示全部楼层
经典,收藏了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则