unity 跟随鼠标 顺时针或逆时针旋转

using UnityEngine;

using System.Collections;



public class StartRotate : MonoBehaviour
{

    private bool m_IsFirst = true;//用于记录第一帧按下鼠标时鼠标的位置,便于计算
    private Vector3 m_CurrentPos;//记录当前帧鼠标所在位置
    private bool m_IsClockwise;//是否顺时针
    private float m_RoundValue = 0;//记录总的旋转角度 用这个数值来控制一圈半
    public float Speed = 58.8f;//动画播放速度
    //public GameObject Lingjian;//手轮零件
    //public GameObject NiutouAnimator;//动画


    private void OnMouseDrag()
    {
        //从摄像机发出到点击坐标的射线
        Ray clickRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit clickPoint;


        if (Physics.Raycast(clickRay, out clickPoint))
        {
            //划出射线,只有在scene视图中才能看到
            Debug.DrawLine(clickRay.origin, clickPoint.point, Color.red);
            //划出射线,只有在scene视图中才能看到
            Vector3 pos;
            pos = clickPoint.point;//射线碰撞的点
            //点与手轮之间的向量坐标
            pos.x = pos.x - transform.position.x;
            pos.y = pos.y - transform.position.y;
            //计算后鼠标以方向盘圆心为坐标原点的坐标位置
            Vector3 pos3 = new Vector3(pos.x, pos.y, 0);


            //用于记录第一帧按下鼠标时鼠标的位置,便于计算
            if (m_IsFirst)
            {
                m_CurrentPos = pos3;
                m_IsFirst = false;
            }


            //计算当前帧和上一帧手指位置 用于判断旋转方向,在Unity3D中,Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积。
            Vector3 currentPos = Vector3.Cross(pos3, m_CurrentPos);
            

            if (currentPos.z > 0)
            {
                //是否顺时针
                m_IsClockwise = true;
                // print(m_RoundValue);
                print("顺时针");
            }
            else if (currentPos.z < 0)
            {
                //是否顺时针
                m_IsClockwise = false;
                // print(m_RoundValue);
                print("逆时针");
            }


            if (m_CurrentPos != pos3)
            {
                //范围内让方向盘随着手指转动
                //顺时针
                if (m_IsClockwise)
                {
                    //记录总的旋转角度 用这个数值来控制一圈半
                    m_RoundValue += Vector3.Angle(m_CurrentPos, pos3);
                    //动画播放速度
                    //NiutouAnimator.GetComponent<Test_AnimSeek>().i = m_RoundValue / Speed;
                    transform.Rotate(new Vector3(0, 0, -Vector3.Angle(m_CurrentPos, pos3)));
                }
                //逆时针
                else
                {
                    //记录总的旋转角度 用这个数值来控制一圈半
                    m_RoundValue -= Vector3.Angle(m_CurrentPos, pos3);
                    //动画播放速度
                    // NiutouAnimator.GetComponent<Test_AnimSeek>().i = m_RoundValue / Speed;
                    transform.Rotate(new Vector3(0, 0, Vector3.Angle(m_CurrentPos, pos3)));
                }
            }
            m_CurrentPos = pos3;
        }
    }


    private void OnMouseUp()
    {
        m_IsFirst = true;
    }
}

欢迎加入U3D交流群,群号码:308093702~~~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌城的小小少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值