Unity3D使用UGUI开发原生虚拟摇杆
作者:即步 发布时间:2021-10-04 17:28:26
标签:Unity3D,UGUI,虚拟摇杆
在Unity3d中开发虚拟摇杆方式有比较多,可以使用EasyTouch、FairyGUI等插件来开发。本文给大家介绍使用Unity3d的原生UGUI来开发出自己的虚拟摇杆,这样可以减少游戏资源包的大小。
先展示下效果图:
现在开发我们的开发
创建一个Image1,并且在Image1创建一个子对象Image2
在Image1中挂载一个自定义脚本,这里我命名为Joystick
脚本代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Joystick : ScrollRect
{
private float mRadius;
public System.Action<RectTransform> JoystickMoveHandle;
public System.Action<RectTransform> JoystickEndHandle;
protected override void Start()
{
mRadius = this.GetComponent<RectTransform>().sizeDelta.x * 0.5f;
this.content.gameObject.SetActive(false);
}
public override void OnDrag(PointerEventData eventData)
{
base.OnDrag(eventData);
this.content.gameObject.SetActive(true);
//虚拟摇杆移动
var contentPostion = this.content.anchoredPosition;
if (contentPostion.magnitude > mRadius)
{
contentPostion = contentPostion.normalized * mRadius;
SetContentAnchoredPosition(contentPostion);
}
//旋转
if (content.anchoredPosition.y != 0)
{
content.eulerAngles = new Vector3(0, 0, Vector3.Angle(Vector3.right, content.anchoredPosition) * content.anchoredPosition.y / Mathf.Abs(content.anchoredPosition.y) - 90);
}
}
private void FixedUpdate()
{
if (this.content.gameObject.activeInHierarchy)
{
if (JoystickMoveHandle != null)
{
JoystickMoveHandle(this.content);
}
}
}
public override void OnEndDrag(PointerEventData eventData)
{
base.OnEndDrag(eventData);
this.content.gameObject.SetActive(false);
if (JoystickEndHandle != null)
{
JoystickEndHandle(this.content);
}
}
}
然后将Image2拖动到content属性变量里
这样就可以移动并且拖动我们的虚拟摇杆了
接下来要让我们的游戏主角跟随我们的摇杆移动而移动
在我们的主角儿挂载一个自定义脚本
在Start方法里添加代码:
mJoystick = GameObject.Find("Joystick").GetComponent<Joystick>();
mJoystick.JoystickMoveHandle = JoystickHandle;
mJoystick.JoystickEndHandle = JoystickEndHandle;
其中JoystickHandle方法代码为:
transform.eulerAngles = new Vector3(0, -content.eulerAngles.z, 0);
transform.Translate(Vector3.forward * Time.deltaTime * mMoveSpeed);
接下来就可以运行我们的游戏,观察主角移动旋转位置。
来源:https://blog.csdn.net/qq_33747722/article/details/79971527


猜你喜欢
- 目录1、需求2、问题2、获取1)导入依赖为了获取客户端类型、操作系统类型、ip、port2)封装获取body字符串的工具类3) * 类4)继
- 本文实例讲述了C#控制台进行文件读写的方法。分享给大家供大家参考。具体如下:C#控制台进行文件写入:using System;using S
- 前言StringJoiner是Java里1.8新增的类,主要是帮助我们把一个列表拼接字符串, 或许有一部分人没有接触过. 所以本文将从使用例
- 在安卓开发导入项目过程中,出现错误再所难免。最近导入项目就遇到如下错误,具体如下图所示。出现如上错误,最初设想先看下项目能不能运行。经尝试可
- 1、在java的构造方法中提供了 异常链.. 也就是我们可以通过构造方法不断的将 异常串联成一个异常链... 之所以需
- spring-AOP 及 AOP获取request各项参数AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事
- 1.后台参数校验Spring Validation验证框架对参数的验证机制提供了@Validated(Spring JSR-303规范,是标
- import java.util.Arrays;public class HeapSort { publ
- 1、普通用户与系统管理员用户的权限要有严格的区分。如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许
- 同类型对象的比较三个维度去比较同一性相等性相似性样例引入想象一下这样的一个场景:小王去图书馆借了一本java核心技术卷1,如图不幸的是小王把
- 引言 批量下载思路,首先前端发送下载请求,携带必要参数,
- @RequestBody出现400 Bad Request的问题今天与同事调试一个接口,发现后台使用@RequestBody老是获取不到数据
- 首先给大家介绍一文件的上传 实体类import java.sql.Timestamp; /** * * @Decription 文件上传实体
- java 对象输入输出流读写文件的操作实例java 支持对对象的读写操作,所操作的对象必须实现Serializable接口。 实例代码:pa
- 本文实例讲述了C#多线程学习之操纵一个线程的方法。分享给大家供大家参考。具体实现方法如下:下面我们就动手来创建一个线程,使用Thread类创
- 本文实例讲述了C#验证给定字符串是否为数字的方法。分享给大家供大家参考。具体分析如下:这段C#代码用于验证给定的字符串是否为数字,不能用于验
- 多线程安全嘛在 Spring 框架中,Bean 是应用程序的核心构建块,代表了在 Spring 容器中管理的对象或组件。Spring 容器负
- 在ibatis的xml文件里,我们去写sql语句,对应mapper类的方法,这些sql语句与控制台上没什么两样,但在有些功能上需要注意,如w
- 服务端注册功能实现通过web层完成客户端和服务端的数据交互(接受数据,发送数据),service层完成业务逻辑(注册,登录),dao层操作数
- 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。分别存储位置: &n