unity实现车方向盘转动效果

效果:
这里写图片描述

c#脚本如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class NewBehaviourScript : MonoBehaviour, IDragHandler,IBeginDragHandler,IEndDragHandler
{
    /// <summary>
    /// 需要旋转的模型
    /// </summary>
    public Transform model;
    /// <summary>
    /// 父物体的recttransform
    /// </summary>
    public RectTransform parentRect;
    /// <summary>
    /// 旋转的UI
    /// </summary>
    public RectTransform img;
    /// <summary>
    /// 摄像机
    /// </summary>
    public Camera cam;
    /// <summary>
    /// 是否在拖拽
    /// </summary>
    private bool drag = false;
    /// <summary>
    /// 初始角度
    /// </summary>
    private float originAngle = 0;
    /// <summary>
    /// 自身角度
    /// </summary>
    private float selfAngle1 = 0;
    /// <summary>
    /// 上一次和当前的角度
    /// </summary>
    private float lastAngle = 0f;
    private float currentAngle = 0f;
    /// <summary>
    /// 上一次和当前的位置
    /// </summary>
    private Vector2 currentPos;
    private Vector2 lastPos;

    public void OnBeginDrag(PointerEventData eventData)
    {
        drag = true;

        originAngle = GetAngle(eventData.position);

        selfAngle1 = (img.transform as RectTransform).eulerAngles.z;
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (drag)
        {
            lastAngle = currentAngle;
            currentAngle = GetAngle(eventData.position);

            float val = TouchJudge(currentPos, ref lastPos, Vector2.zero);
            if (val > 0f && val <180f)
            {
                img.eulerAngles = new Vector3(0f,0f, -currentAngle + originAngle + selfAngle1);
                model.eulerAngles = new Vector3(0f, 0f, -currentAngle + originAngle + selfAngle1);
            }
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        drag = false;
    }
    /// <summary>
    /// 将屏幕坐标转成UI坐标
    /// </summary>
    /// <param name="pos1"></param>
    /// <returns></returns>
    float GetAngle(Vector2 pos1) {
        Vector2 pos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, pos1, cam, out pos);
        currentPos = pos;
        return Mathf.Atan2(pos.x, pos.y) * Mathf.Rad2Deg;
    }
    /// <summary>
    /// 判断顺时针还是逆时针旋转
    /// </summary>
    /// <param name="current"></param>
    /// <param name="last"></param>
    /// <param name="anchor"></param>
    /// <returns></returns>
    private float TouchJudge(Vector2 current, ref Vector2 last, Vector2 anchor)
    {
        Vector2 lastDir = (last - anchor).normalized; 
        Vector2 currentDir = (current - anchor).normalized;

        float lastDot = Vector2.Dot(Vector2.right, lastDir);
        float currentDot = Vector2.Dot(Vector2.right, currentDir);

        float lastAngle = last.y < anchor.y
              ? Mathf.Acos(lastDot) * Mathf.Rad2Deg
              : -Mathf.Acos(lastDot) * Mathf.Rad2Deg;

        float currentAngle = current.y < anchor.y
            ? Mathf.Acos(currentDot) * Mathf.Rad2Deg
            : -Mathf.Acos(currentDot) * Mathf.Rad2Deg;

        last = current;
        return currentAngle - lastAngle;
    }
}

canvas设置如下:
这里写图片描述

脚本赋值如下:
这里写图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值