1. 程式人生 > 程式設計 >unity實現車方向盤轉動效果

unity實現車方向盤轉動效果

本文例項為大家分享了unity實現車方向盤轉動效果的具體程式碼,供大家參考,具體內容如下

效果:

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,-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設定如下:

unity實現車方向盤轉動效果

指令碼賦值如下:

unity實現車方向盤轉動效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。