上一章把输入管理器各个模块基本功能和简单的代码逻辑已经讲述了,本章就以移动摇杆的功能实现,把整个【输入管理控制器】的代码给大家讲述一遍
上一章内容连接:
Unity游戏开发之【输入管理器设计】 第一章
以下包括摇杆功能实现和输入控制系统的代码。代码按照逻辑顺序进行整理。
using System;
using UnityEngine;
// 输入事件类型
public enum InputEventType
{
JoystickMove
}
// 输入事件数据基类
public abstract class InputEventData
{
}
// 触摸事件数据
public class TouchEventData : InputEventData
{
public Vector2 Position { get; private set; }
public TouchPhase Phase { get; private set; }
public TouchEventData(Vector2 position, TouchPhase phase)
{
Position = position;
Phase = phase;
}
}
// 摇杆移动事件数据
public class JoystickMoveEventData : InputEventData
{
public Vector2 Position { get; private set; }
public JoystickMoveEventData(Vector2 position)
{
Position = position;
}
}
// 输入处理器接口
public interface IInputProcessor
{
void OnInputEvent(InputEventType eventType, InputEventData eventData);
}
// 输入过滤器接口
public interface IInputFilter
{
bool ProcessInputEvent(InputEventData eventData, IInputProcessor inputProcessor);
}
// 摇杆输入过滤器
public class JoystickInputFilter : IInputFilter
{
public Rect joystickArea; // 摇杆区域
public float joystickRadius = 50f; // 摇杆半径
private Vector2 joystickOrigin; // 摇杆中心位置
private bool isDragging = false;
public bool ProcessInputEvent(InputEventData eventData, IInputProcessor inputProcessor)
{
if (eventData is TouchEventData touchEventData)
{
Vector2 touchPosition = touchEventData.Position;
if (touchEventData.Phase == TouchPhase.Began)
{
if (joystickArea.Contains(touchPosition))
{
joystickOrigin = touchPosition;
isDragging = true;
return true;
}
}
else if (touchEventData.Phase == TouchPhase.Moved && isDragging)
{
Vector2 joystickPosition = touchPosition - joystickOrigin;
if (joystickPosition.magnitude > joystickRadius)
{
joystickPosition = joystickPosition.normalized * joystickRadius;
}
JoystickMoveEventData joystickMoveEventData = new JoystickMoveEventData(joystickPosition);
inputProcessor.OnInputEvent(InputEventType.JoystickMove, joystickMoveEventData);
return true;
}
else if (touchEventData.Phase == TouchPhase.Ended || touchEventData.Phase == TouchPhase.Canceled)
{
isDragging = false;
// 可以在这里分发一个摇杆归中事件或停止移动物体
return true;
}
}
return false;
}
}
// 输入管理系统(单例模式)
public class InputManager : IInputProcessor
{
private static InputManager instance;
public static InputManager Instance
{
get
{
if (instance == null)
{
instance = new InputManager();
}
return instance;
}
}
private IInputFilter joystickInputFilter;
private InputManager()
{
joystickInputFilter = new JoystickInputFilter
{
joystickArea = new Rect(100, 100, 100, 100) // 假设摇杆区域在屏幕上的一个固定位置
};
}
public void ProcessTouchEvent(Vector2 position, TouchPhase phase)
{
TouchEventData touchEventData = new TouchEventData(position, phase);
joystickInputFilter.ProcessInputEvent(touchEventData, this);
}
public void OnInputEvent(InputEventType eventType, InputEventData eventData)
{
if (eventType == InputEventType.JoystickMove)
{
JoystickMoveEventData joystickMoveEventData = (JoystickMoveEventData)eventData;
// 在这里处理摇杆移动事件,例如移动游戏对象
Debug.Log("Joystick moved to: " + joystickMoveEventData.Position);
}
}
}
// 游戏管理控制器
public class GameManager : MonoBehaviour
{
private void Start()
{
}
private void Update()
{
// 假设这里从某处获取触摸信息
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
InputManager.Instance.ProcessTouchEvent(touch.position, touch.phase);
}
}
}
在这个修改后的代码中,InputManager
类负责处理输入事件,并将它们分发给相应的过滤器。JoystickInputFilter
类是一个输入过滤器,它负责将触摸输入转换为摇杆移动事件。GameManager
类是整个游戏的管理控制器,它创建了一个 InputManager
实例,并在每一帧中处理触摸输入。
以下是脚本挂载的层级关系:
-
创建并挂载
GameManager
:- 在Unity编辑器中,创建一个新的空游戏物体,命名为“GameManager”。
- 将
GameManager
脚本拖拽到这个新创建的游戏物体上,这样GameManager
就被挂载到了“GameManager”游戏物体上。
-
处理
InputManager
:InputManager
不需要被挂载到任何游戏物体上。GameManager
使用InputManager
来处理输入事件。