首页 > 其他分享 >Unity游戏开发之【输入管理器设计】 第二章

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

时间:2024-08-04 16:28:58浏览次数:9  
标签:管理器 private 摇杆 Unity InputManager GameManager 第二章 public 输入

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

上一章内容连接
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来处理输入事件。

标签:管理器,private,摇杆,Unity,InputManager,GameManager,第二章,public,输入
From: https://blog.csdn.net/weixin_42069404/article/details/140845565

相关文章

  • C# & Unity 面向对象补全计划 七大原则 之 里氏替换
    本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正本系列作为七大原则和设计模式的进阶知识,看不懂没关系请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章,本知识点与其密切相关1.里氏替换原则里氏替换原则(LiskovSubstitutionPrinciple,LS......
  • 3:python语法第二章:语法基础2(适合小白进行观看)
    目录:3.1条件控制语句3.1.1基本的if,else语句3.1.2if嵌套首先学习两个语句的话,最为重要的就是要搞清楚这个底层逻辑是啥,学会了底层的逻辑便很容易的写出代码。3.1条件控制语句3.1.1基本的if,else语句基本的if,else的代码,可以首先理解一些什么是if,在英文中if指的是如果,所以说......
  • 2:python第二章:python语法基础1(适合小白学习)
    目录2.1:变量2.1.1变量的赋值与更换变量的值2.1.2变量的名称2.1.3多个变量的赋值2.1.4变量的输出2.2:数据结构(基本数据结构)2.2.1字符串(string)2.2.1.1访问字符(索引)2.2.1.2切片2.2.2整数(integer)2.2.3浮点数(float)2.2.4复数(complexnumber)2.3:运算符 2.3.1基本的运算......
  • 实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出
    从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上进行扩展。首先,我们先来解决第一章遗留的第一个问题:输入数据会被stdin缓存......
  • 【介绍下Unity编辑器扩展】
    ......
  • 【Unity XR Input 获取Quest和Pico各个按键状态,按下、抬起、按下中】
    usingSystem;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.XR;usingQFramework;///<summary>///提供各种输入事件///</summary>publicclassInputEvent:MonoSingleton<InputEvent>{//*************输入设别***********......
  • LogCat连接安卓手机拉取日志到本地(Unity开发版)
    unity开发游戏的时候经常会碰到安卓手机真机报错/崩溃,定位问题需要拉取安卓手机上的日志到电脑上来查看。1.unity安装的时候,勾选安卓模块(sdk这些记得勾选安装)2.打开对应安卓模块个目录下的adb目录,当前我的安装目录为C:\ProgramFiles\Unity\Hub\Editor\2021.3.32f1\Editor\D......
  • 【unity小技巧】unity性能优化以及如何进行性能测试
    文章目录前言GPU性能优化打包素材CPU性能优化代码执行优化性能测试Vector2.Distance和sqrMagnitude哪个好?动画切换优化shader属性优化URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结前言功能的......
  • C# & Unity 面向对象补全计划 之 接口
    本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝1.接口在C#中,接口(interface)是一种定义了一组方法、属性和事件的类型接口只包含成员的声明,而不包含任何实现,实现接口的类必须......
  • Unity中调试Scroll View,一个Scroll View可以加载不同的图片
    1.所有的图片宽度要相同(最好)2.锚点设置usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassScrollImageScale:MonoBehaviour{publicImageimage;publicGameObjectcontent;privatef......