unity实现车方向盘转动效果

所属分类: 软件编程 / C#教程 阅读数: 81
收藏 0 赞 0 分享

本文实例为大家分享了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设置如下:

脚本赋值如下:

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

更多精彩内容其他人还在看

C#获取并修改文件扩展名的方法

这篇文章主要介绍了C#获取并修改文件扩展名的方法,实例分析了C#编程方式修改文件扩展名的技巧,涉及Path类的使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历操作系统下所有驱动器的方法

这篇文章主要介绍了C#遍历操作系统下所有驱动器的方法,涉及C#中DriveInfo类GetDrivers方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历指定目录下所有文件的方法

这篇文章主要介绍了C#遍历指定目录下所有文件的方法,实例分析了C#中GetFiles()方法遍历文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#拷贝文件简单实现方法

这篇文章主要介绍了C#拷贝文件简单实现方法,主要分析了FileInfo类中CopyTo方法针对文件复制的操作技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#获取文件相关信息的方法

这篇文章主要介绍了C#获取文件相关信息的方法,涉及C#中FileInfo类的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#交错数组用法实例

这篇文章主要介绍了C#交错数组用法,较为详细的分析了交错数组的概念、用法并实例分析了交错数组的使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现在前端网页弹出警告对话框(alert)的方法

这篇文章主要介绍了C#实现在前端网页弹出警告对话框(alert)的方法,涉及C#通过自定义函数调用window.alert方法弹出对话框的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现控制Windows系统关机、重启和注销的方法

这篇文章主要介绍了C#实现控制Windows系统关机、重启和注销的方法,涉及C#调用windows系统命令实现控制开机、关机等操作的技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取Excel并转化成XML的方法

这篇文章主要介绍了C#读取Excel并转化成XML的方法,实例分析了C#操作Excel及XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#创建一个Word并打开的方法

这篇文章主要介绍了C#创建一个Word并打开的方法,实例分析了C#操作word的常用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多