非常に詳しく説明しますが、Unity ではどのようにしてキャラクターが歩くためのジョイスティックを作成するのでしょうか?

導入

ゲームでは、移動ジョイスティックは、プレーヤーがタッチまたはマウス入力を通じてゲーム オブジェクトの動きを制御できるようにする一般的なユーザー インターフェイス要素です。モバイル ジョイスティックは通常、円形または正方形の背景と、ドラッグできる小さなボール (サムスティックと呼ばれます) で構成されます。プレイヤーはサムスティックをドラッグすることでゲーム オブジェクトの移動方向と速度を制御できます。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入


方法

1. ジョイスティック領域を表示する最初のキャンバス画像を作成します

ここに画像の説明を挿入


2. ジョイスティックの制御点を表示する 2 番目のキャンバス イメージを作成します。

ここに画像の説明を挿入
ここに画像の説明を挿入


3. スクリプト GameTouch を 2 番目の画像にマウントし、タグを「プレーヤー」に設定します

以下は、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;  // 将遥杆移回起始位置
	}
}

このスクリプトは基本的なモバイル ジョイスティックを実装しており、プレーヤーがジョイスティックをドラッグすると、ジョイスティックの移動値が記録され、ジョイスティックが適切な位置に移動します。このスクリプトは、ユーザー入力イベントを処理するための Unity イベント システムのインターフェイスである IBeginDragHandler、IDragHandler、および IEndDragHandler の 3 つのインターフェイスを実装します。プレーヤーがジョイスティックのドラッグを開始すると、OnBeginDrag() 関数はジョイスティックの開始位置を記録します。プレーヤーがジョイスティックをドラッグすると、OnDrag() 関数はジョイスティックの移動値を計算し、ジョイスティックを適切な位置に移動します。最大移動距離を制限し、プレーヤーがジョイスティックのドラッグを停止すると、OnEndDrag() 関数はジョイスティックの移動値をリセットし、ジョイスティックを開始位置に戻します。

ここに画像の説明を挿入


4. ジョイスティックの制御オブジェクトとして新しいキューブを作成し、スクリプト 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 コンポーネントであることを示しています。

パブリック浮動小数点可変速度は、オブジェクトの移動速度を制御するために宣言されます。

GameTouch コンポーネントの参照を格納するために、プライベート GameTouch 型変数 gameTouch が宣言されます。

Start() メソッドは、スクリプトの開始時に呼び出されます。このメソッドでは、ラベルを通じて「Player」という名前のゲーム オブジェクトが見つかり、その上の GameTouch コンポーネントへの参照が取得されます。

GameTouch コンポーネントが見つかった場合は、それを gameTouch 変数に割り当てます。見つからない場合は、エラー メッセージを出力します。

Update() メソッドはフレームごとに呼び出されます。このメソッドでは、ジョイスティックの移動値を格納する gameTouch の Pos プロパティを取得します。

ジョイスティックの移動値に応じてオブジェクトの移動方向を計算し、Vector3 の正規化メソッドを使用して標準化します。

オブジェクトの移動距離を計算し、Mathf.Clamp メソッドを使用して移動値を 0 ~ 30 の範囲に制限し、速度と Time.deltaTime を乗算してスムーズな移動を確保します。

移動方向×移動距離に沿ってオブジェクトを移動し、オブジェクトの位置を更新します。


5. 観察しやすいようにカメラの位置を調整します

ここに画像の説明を挿入


デモ

ここに画像の説明を挿入


Supongo que te gusta

Origin blog.csdn.net/qq_20179331/article/details/130702986
Recomendado
Clasificación