Unity实现的汽车方向盘转动效果[完整案例]
说明:
这是一个UI界面中操作方向盘的演示,源于一个游戏项目,仅供学习参考,其中:
1、方向盘可复原
2、Android测试能够正常操作,没有出现轴心偏离现象(测试机型Galaxy S8-分辨率:2960x1440)
注意:
如果你要使用这个脚本,应将Rect Transfrom设置成如下属性,当然,某些属性不是必须要这么设定,但至少这样做可以正常工作,作为一个案例,供参考!
1、Rect Transfrom相关属性设定
2、其画布下的SteerWheel是Image类型的UI元素,图像设定为方向盘图片
3、Game
4、Inspector
5、演示结果
代码:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using System.Collections;/// <summary>
/// Steering wheel.
/// Defines the steerign wheel behaviour.
/// Original source:
/// http://forum.unity3d.com/threads/touchscreen-steering-wheel-rotation-example-mouse-supported.196741/
/// </summary>
public class SteeringWheel2D : MonoBehaviour
{[Tooltip("UI_Element通常它是一个Image类型的图像")][Header("方向盘UI本体")]public Graphic UI_Element;[Header("方向盘最大旋转角度")]public float maximumSteeringAngle = 520f;[Header("方向盘旋转复原速度")]public float wheelReleasedSpeed = 700f;[Header("方向盘当前旋转角度")]public float wheelAngle = 0f;float wheelPrevAngle = 0f;bool wheelBeingHeld = false;RectTransform rectT;[Tooltip("centerPoint是方向盘旋转的中心,其中你应将设定UI_Element的Img图片")][Header("方向盘旋转中心点")]public Vector2 centerPoint;/// <summary>/// Gets the clamped value./// Returns a value in range [-1,1] similar to GetAxis("Horizontal")/// 返回旋转进度比/// </summary>/// <returns>The clamped value.</returns>public float GetClampedValue(){return wheelAngle / maximumSteeringAngle;}/// <summary>/// Gets the angle./// returns the wheel angle itself without clamp operation/// 获取实际旋转角度(-520°~520°)/// </summary>/// <returns>The angle.</returns>public float GetAngle(){return wheelAngle;}/// <summary>/// Use this for initialization./// </summary>void Start(){rectT = UI_Element.rectTransform;InitEventsSystem();UpdateRect();}/// <summary>/// Initializes the events system to catch/// the user movements.i.e. MouseDown/MouseDrag/MouseUp./// </summary>void InitEventsSystem(){EventTrigger events = UI_Element.gameObject.GetComponent<EventTrigger>();if (events == null)events = UI_Element.gameObject.AddComponent<EventTrigger>();if (events.triggers == null)events.triggers = new System.Collections.Generic.List<EventTrigger.Entry>();EventTrigger.Entry entry = new EventTrigger.Entry();EventTrigger.TriggerEvent callback = new EventTrigger.TriggerEvent();UnityAction<BaseEventData> functionCall = new UnityAction<BaseEventData>(PressEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.PointerDown;entry.callback = callback;events.triggers.Add(entry);entry = new EventTrigger.Entry();callback = new EventTrigger.TriggerEvent();functionCall = new UnityAction<BaseEventData>(DragEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.Drag;entry.callback = callback;events.triggers.Add(entry);entry = new EventTrigger.Entry();callback = new EventTrigger.TriggerEvent();functionCall = new UnityAction<BaseEventData>(ReleaseEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.PointerUp;entry.callback = callback;events.triggers.Add(entry);}/// <summary>/// Initializes the center point of seetring wheel transform/// rectangle./// 初始化方向盘变换矩形的旋转中心点。/// </summary>void UpdateRect(){Vector3[] corners = new Vector3[4];rectT.GetWorldCorners(corners);for (int i = 0; i < 4; i++){corners[i] = RectTransformUtility.WorldToScreenPoint(null, corners[i]);}Vector3 bottomLeft = corners[0];Vector3 topRight = corners[2];float width = topRight.x - bottomLeft.x;float height = topRight.y - bottomLeft.y;Rect _rect = new Rect(bottomLeft.x, topRight.y, width, height);centerPoint = new Vector2(_rect.x + _rect.width * 0.5f, _rect.y - _rect.height * 0.5f);}/// <summary>/// Update is called once per frame./// Update the wheel status. If the /// wheel is released, reset the rotation/// to initial (zero) rotation by /// wheelReleasedSpeed degrees per second/// </summary>void Update(){if (!wheelBeingHeld && !Mathf.Approximately(0f, wheelAngle)){float deltaAngle = wheelReleasedSpeed * Time.deltaTime;if (Mathf.Abs(deltaAngle) > Mathf.Abs(wheelAngle))wheelAngle = 0f;else if (wheelAngle > 0f)wheelAngle -= deltaAngle;elsewheelAngle += deltaAngle;}rectT.localEulerAngles = Vector3.back * wheelAngle;}/// <summary>/// Presses the event./// Executed when mouse/finger starts touching the steering wheel./// </summary>/// <param name="eventData">Event data.</param>public void PressEvent(BaseEventData eventData){Vector2 pointerPos = ((PointerEventData)eventData).position;wheelBeingHeld = true;wheelPrevAngle = Vector2.Angle(Vector2.up, pointerPos - centerPoint);}/// <summary>/// Drags the event./// Executed when mouse/finger is dragged over the steering wheel./// Do nothing if the pointer is too close to the center of the wheel./// Make sure wheel angle never exceeds maximumSteeringAngle./// </summary>/// <param name="eventData">Event data.</param>public void DragEvent(BaseEventData eventData){Vector2 pointerPos = ((PointerEventData)eventData).position;float wheelNewAngle = Vector2.Angle(Vector2.up, pointerPos - centerPoint);if (Vector2.Distance(pointerPos, centerPoint) > 20f){if (pointerPos.x > centerPoint.x)wheelAngle += wheelNewAngle - wheelPrevAngle;elsewheelAngle -= wheelNewAngle - wheelPrevAngle;}wheelAngle = Mathf.Clamp(wheelAngle, -maximumSteeringAngle, maximumSteeringAngle);wheelPrevAngle = wheelNewAngle;}/// <summary>/// Executed when mouse/finger stops touching the steering wheel/// Performs one last DragEvent, just in case/// </summary>/// <param name="eventData">Event data.</param>public void ReleaseEvent(BaseEventData eventData){DragEvent(eventData);wheelBeingHeld = false;}
}
—END—
Unity实现的汽车方向盘转动效果[完整案例]相关推荐
- html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)
本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...
- html放大镜原理,Canvas实现放大镜效果完整案例分析(附代码)
本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...
- 【Unity Shader】聚光灯体积光效果的简单实现
效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...
- Unity 之 ShaderGraph 实现旋涡(传送门)效果入门级教程
Unity 之 ShaderGraph 实现旋涡[传送门]效果入门级教程 一,最终效果展示 二,创建PBRGraph 三,实现原理介绍 四,完整效果实现 五,应用到场景中 若你的工程还没有进行基础配置 ...
- Unity接入罗技G29方向盘,通过SDK获取按键信息
Unity接入罗技G29方向盘,通过SDK获取按键信息 说明: 最近需要做一个外设汽车驾驶相关的软件,采用的外设 罗技G29方向盘,项目中遇到的问题这里记录一下. 项目准备: 1.下载罗技的S ...
- Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity MP4 |视频:h264,1280x720 |音频:A ...
- Unity的NGUI插件篇——入场效果
Unity的NGUI插件篇--入场效果 入场效果 入场效果需要借助于NGUI提供的TweenPosition类来完成,为了说明此类的使用方法,本节将使会讲解两个示例.本文选自 大学霸 <NGU ...
- android金币动效_Android 仿余额宝数字跳动动画效果完整代码
一:想都不用想的,有图有真相,看着爽了,在看下面源码 二:实例源码分析 ①:首先定义接口 package com.demo.tools.view; /** * 数字动画自定义 * * @author ...
- Unity Shader 之 简单 护盾Shield 效果的实现
Unity Shader 之 简单 护盾Shield 效果的实现 目录 Unity Shader 之 简单 护盾Shield 效果的实现 一.简单介绍 二.实现原理
最新文章
- 汽车车牌识别系统(六)-- 项目中的各个文件解析
- 重构学习1-重命名方法、类、参数等
- 剑网三缘起的云端游戏,千呼万唤终于出来,有玩家不知道怎么玩?
- 16进制数组转成10进制 qt_QT 十六进制字符串转化为十六进制编码
- Python读取文本文档转化成列表
- js indexOf()
- 2754. [SCOI2012]喵星球上的点名【后缀数组】
- 【链接】Eclipse的Debug调试技巧
- socket.io实现客户端和服务端的双向通信
- 程序中的@Override是什么意思?
- 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载
- Paused before potential out-of-memory crash页面崩溃
- Kibana启动报错 server is not ready yet的解决方案
- centos6.5 ifconfig 显示为eth2,配置文件只有eth0
- BZOJ---4484:[Jsoi2015]最小表示【bitset】
- 手机DIY自制现身南瓜网
- 计算机毕业设计网吧管理,【毕业设计】计算机毕业设计网吧管理系统
- 基于xc7k325t fbg900的IBRET的测试流程
- 21世纪东方美女标准[男士参考女士学习]
- 华容道 java swing