Unity游戏开发之【输入管理器设计】 第二章

上一章把输入管理器各个模块基本功能和简单的代码逻辑已经讲述了,本章就以移动摇杆的功能实现,把整个【输入管理控制器】的代码给大家讲述一遍

上一章内容连接
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 实例,并在每一帧中处理触摸输入。

以下是脚本挂载的层级关系:

  1. 创建并挂载GameManager

    • 在Unity编辑器中,创建一个新的空游戏物体,命名为“GameManager”。
    • GameManager脚本拖拽到这个新创建的游戏物体上,这样GameManager就被挂载到了“GameManager”游戏物体上。
  2. 处理InputManager

    • InputManager不需要被挂载到任何游戏物体上。
    • GameManager使用InputManager来处理输入事件。
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂跳跳虎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值