unity实现车方向盘转动效果

效果:
unity实现车方向盘转动效果_第1张图片

c#脚本如下:

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

public class NewBehaviourScript : MonoBehaviour, IDragHandler,IBeginDragHandler,IEndDragHandler
{
    /// 
    /// 需要旋转的模型
    /// 
    public Transform model;
    /// 
    /// 父物体的recttransform
    /// 
    public RectTransform parentRect;
    /// 
    /// 旋转的UI
    /// 
    public RectTransform img;
    /// 
    /// 摄像机
    /// 
    public Camera cam;
    /// 
    /// 是否在拖拽
    /// 
    private bool drag = false;
    /// 
    /// 初始角度
    /// 
    private float originAngle = 0;
    /// 
    /// 自身角度
    /// 
    private float selfAngle1 = 0;
    /// 
    /// 上一次和当前的角度
    /// 
    private float lastAngle = 0f;
    private float currentAngle = 0f;
    /// 
    /// 上一次和当前的位置
    /// 
    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;
    }
    /// 
    /// 将屏幕坐标转成UI坐标
    /// 
    /// 
    /// 
    float GetAngle(Vector2 pos1) {
        Vector2 pos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, pos1, cam, out pos);
        currentPos = pos;
        return Mathf.Atan2(pos.x, pos.y) * Mathf.Rad2Deg;
    }
    /// 
    /// 判断顺时针还是逆时针旋转
    /// 
    /// 
    /// 
    /// 
    /// 
    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设置如下:
unity实现车方向盘转动效果_第2张图片

脚本赋值如下:
unity实现车方向盘转动效果_第3张图片

你可能感兴趣的:(unity)