Unity 操作/事件/委托混淆

Unity Actions/events/delegates confusion

提问人:colossalchrist97 提问时间:7/15/2023 更新时间:7/16/2023 访问量:21

问:

在Unity中为我正在处理的一个小项目设置Actions时遇到一些问题。很想得到一些指导,因为我有点困惑。

基本设置如下:

我单击一个 ui 按钮元素,将玩家角色向某个方向移动。即向前、向后、向左、向右。

    void onMoveForwardClicked()
    {
        Actions.OnPlayerMoved(Directions.Forward);
    }

我有一个叫做 Actions 的类,看起来像这样

public static class Actions
{
    public static Action<Directions> OnPlayerMoved;
}

我的播放器脚本有一个方法,它接受方向的枚举参数,并使用 switch 语句为我用作地图/竞技场的 2d 数组设置新位置。

    public void MovePlayer(Directions direction)
    {
        switch (direction)
        {
            case Directions.Forward:
                    _NewPositionInRing.x -= 1;
                    break;
            case Directions.Backward:
                    _NewPositionInRing.x += 1;
                    break;
            case Directions.Left:
                    _NewPositionInRing.y -= 1;
                    break;
            case Directions.Right:
                    _NewPositionInRing.y += 1;
                    break;
            default:
                break;
        }
    }

我的地图类实例化了 10x10 的 2D 数组,并为玩家设置了初始位置。地图类还具有设置玩家新位置并将旧位置重置为 0(空白区域)的方法

    public void setNewPlayerPositions(Vector2Int oldPos, Vector2Int newPos, int playerID)
    {
        Debug.Log("oldPos: X:" + oldPos.x + ", Y:" + oldPos.y);
        Debug.Log("newPos: X:" + newPos.x + ", Y:" + newPos.y);
 
        Player1Postions = new Vector2Int(newPos.x, newPos.y);
        mapArray[newPos.x, newPos.y] = playerID;
        mapArray[oldPos.x, oldPos.y] = 0;
    }

我对如何连接这个 ui 按钮有点困惑,例如当单击它时,它会使用 unity Actions 更新正确的值。

我可能从根本上误解了如何做到这一点,但我愿意学习,所以任何帮助都是值得赞赏的。谢谢!

我已经按照本教程 https://www.youtube.com/watch?v=8fcI8W9NBEo,但是当多个侦听器发挥作用并且参数复杂化时,我在~9分钟左右迷失了方向。

unity-game-engine 事件 委托 动作 游戏开发

评论


答:

0赞 Yusuf 7/16/2023 #1

基本上,在 C# 中使用 Action 时有 3 个步骤:定义、侦听和调用。

首先,定义它。您已经用以下行定义了它:

public static Action<Directions> OnPlayerMoved;

第二,听听。你没有在听。想象一下,这就像订阅 youtube 频道一样。如果您订阅了,则可以从频道接收通知。所以你应该像这样听你的行动:

Actions.OnPlayerMoved += OnPlayerMovedListenerMethod;

private void OnPlayerMovedListenerMethod(Directions direction)
{
    Debug.Log(direction);
}

最后,您应该调用它。但你已经做到了。

Actions.OnPlayerMoved(Directions.Forward);

这是最基本的。为了进一步研究,您可以了解以下内容:

  • event 关键字
  • 功能
  • delegate 关键字