unity实现车方向盘转动效果

 更新时间:2020年04月18日 12:38:24   作者:贪玩的孩纸时代  
这篇文章主要为大家详细介绍了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, 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# 观察者模式实例介绍

    一个简单的例子,比如说猫叫,老鼠跑,主人被惊醒,在不知道观察者模式之前,我们的代码可能是这样的
    2012-10-10
  • Unity3D使用UGUI开发原生虚拟摇杆

    Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#实现过滤html标签并保留a标签的方法

    C#实现过滤html标签并保留a标签的方法

    这篇文章主要介绍了C#实现过滤html标签并保留a标签的方法,文中的自定义函数采用正则过滤实现了该功能,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • string与stringbuilder两者的区别

    string与stringbuilder两者的区别

    今天小编就为大家分享一篇关于string与stringbuilder两者的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • c#中switch case的用法实例解析

    c#中switch case的用法实例解析

    这篇文章主要介绍了c#中switch case的用法实例解析,对于C#的初学者来说有必要熟练掌握,需要的朋友可以参考下
    2014-08-08
  • C#中static关键字的具体使用

    C#中static关键字的具体使用

    本篇文章详细介绍了C#中static关键字的含义、用途、与其他关键字的关系以及它在不同作用域中的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C#验证码问题的快速解决方法

    C#验证码问题的快速解决方法

    下面小编就为大家带来一篇C#验证码问题的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • C# 16进制与字符串、字节数组之间的转换

    C# 16进制与字符串、字节数组之间的转换

    在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换
    2009-05-05
  • Unity通过代码修改按钮点击效果

    Unity通过代码修改按钮点击效果

    这篇文章主要为大家详细介绍了Unity通过代码修改按钮点击效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • C#简单多线程同步和优先权用法实例

    C#简单多线程同步和优先权用法实例

    这篇文章主要介绍了C#简单多线程同步和优先权用法实例,对于C#线程的阻塞、同步、异步、互斥等概念做了较为深入的分析与实例讲解,需要的朋友可以参考下
    2014-09-09

最新评论