超详细,unity如何制作人物行走的遥杆?

本文介绍了如何在Unity中创建移动遥杆,包括使用两个canvas图片分别作为遥杆区域和控制点,通过GameTouch脚本处理开始拖动、拖动中和结束拖动的事件,以及ObjectMover脚本控制游戏对象的移动。利用Unity的事件系统和脚本,实现了玩家通过触摸或鼠标控制游戏对象移动的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

在游戏中,移动遥杆是一种常见的用户界面元素,它允许玩家通过触摸或鼠标输入来控制游戏对象的移动。移动遥杆通常由一个圆形或方形的背景和一个可以拖动的小球(称为拇指杆)组成。玩家可以通过拖动拇指杆来控制游戏对象的移动方向和速度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


方法

1.新建第一个canvas图片,用于显示遥杆区域

在这里插入图片描述


2.新建第二个canvas图片,用于显示遥杆控制点

在这里插入图片描述
在这里插入图片描述


3.给第二个图片挂载脚本GameTouch,Tag设置为“Player”

以下是对GameTouch脚本每行代码的注释:

using UnityEngine;
using UnityEngine.EventSystems;  // 引入Unity事件系统命名空间

public class GameTouch : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
	Vector2 startPos;  // 记录遥杆起始位置
	public Vector2 Pos;  // 记录遥杆的移动值

	public void OnBeginDrag(PointerEventData eventData)  // 当玩家开始拖拽遥杆时执行
	{
		startPos = transform.position;  // 记录遥杆的起始位置
	}

	public void OnDrag(PointerEventData eventData)  // 当玩家拖拽遥杆时执行
	{
		Pos = eventData.position - startPos;  // 计算遥杆的移动值
		transform.position = Vector2.ClampMagnitude(Pos, 30) + startPos;  // 移动遥杆并限制其最大移动距离
	}

	public void OnEndDrag(PointerEventData eventData)  // 当玩家停止拖拽遥杆时执行
	{
		Pos = Vector2.zero;  // 重置遥杆的移动值
		transform.position = startPos;  // 将遥杆移回起始位置
	}
}

这个脚本实现了一个基本的移动遥杆,当玩家拖拽遥杆时,它会记录遥杆的移动值,并将遥杆移动到合适的位置。这个脚本实现了三个接口:IBeginDragHandler、IDragHandler和IEndDragHandler,这些接口都是Unity事件系统中的接口,用于处理用户输入事件。当玩家开始拖拽遥杆时,OnBeginDrag()函数将记录遥杆的起始位置;当玩家拖拽遥杆时,OnDrag()函数将计算遥杆的移动值,并将遥杆移动到合适的位置,并限制其最大移动距离;当玩家停止拖拽遥杆时,OnEndDrag()函数将重置遥杆的移动值,并将遥杆移回起始位置。

在这里插入图片描述


4.新建一个cube,作为遥杆的控制对象,挂载脚本ObjectMover

using UnityEngine;

public class ObjectMover : MonoBehaviour
{
	public float speed = 5f; // 物体移动的速度
	private GameTouch gameTouch; // 存储GameTouch组件的引用

	private void Start()
	{
		GameObject player = GameObject.FindGameObjectWithTag("Player"); // 获取标签为"Player"的物体
		if (player != null) {
			gameTouch = player.GetComponent<GameTouch>(); // 获取GameTouch组件
		}
		if (gameTouch == null) {
			Debug.LogError("GameTouch component not found on Player object!");
		}
	}

	private void Update()
	{
		// 获取遥杆的移动值
		float horizontal = gameTouch.Pos.x;
		float vertical = gameTouch.Pos.y;

		// 计算物体的移动方向
		Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;

		// 计算物体的移动距离
		float distance = Mathf.Clamp(gameTouch.Pos.magnitude, 0f, 30f) / 30f;
		distance *= speed * Time.deltaTime;

		// 移动物体
		transform.position += direction * distance;
	}
}

在这里插入图片描述
定义了一个名为ObjectMover的类,该类继承自MonoBehaviour,表示它是一个Unity组件。

声明了一个公有的浮点型变量speed,用于控制物体移动的速度。

声明了一个私有的GameTouch类型变量gameTouch,用于存储GameTouch组件的引用。

Start()方法在脚本启动时被调用。在该方法中,通过标签查找到一个名为"Player"的游戏对象,并获取其上的GameTouch组件的引用。

如果找到了GameTouch组件,则将其赋值给gameTouch变量;否则输出错误信息。

Update()方法在每一帧都被调用。在该方法中,获取gameTouch的Pos属性,该属性存储了一个遥杆的移动值。

根据遥杆的移动值计算出物体的移动方向,使用Vector3的normalized方法将其标准化。

计算物体的移动距离,使用Mathf.Clamp方法将移动值限制在0到30之间,并乘以speed和Time.deltaTime,确保移动平滑。

将物体沿着移动方向乘以移动距离进行移动,更新物体的位置。


5.调整摄像机位置,便于观察

在这里插入图片描述


演示

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忽然602

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值