Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有由附加脚本控制的脚本的Unity控件对象_C#_Unity3d - Fatal编程技术网

C# 具有由附加脚本控制的脚本的Unity控件对象

C# 具有由附加脚本控制的脚本的Unity控件对象,c#,unity3d,C#,Unity3d,我遵循了为我的项目制作Tron游戏的教程,我想添加多人游戏功能。我已经建立了一个信息系统,手机向显示游戏的电脑发送方向改变信息,然后让玩家改变方向。每个玩家都由一个附加的“移动”脚本控制,该脚本使用对自身的引用和一组基于键输入的方法。我试图让我的游戏经理从手机接收这些信息,并让玩家切换方向——我试图让移动脚本具有静态元素,但这似乎破坏了它 有没有一个好的方法可以做到这一点,或者更可取的做法是编写一个新的移动脚本,它可以同时控制其他地方的所有玩家 目前的代码如下: switch (directio

我遵循了为我的项目制作Tron游戏的教程,我想添加多人游戏功能。我已经建立了一个信息系统,手机向显示游戏的电脑发送方向改变信息,然后让玩家改变方向。每个玩家都由一个附加的“移动”脚本控制,该脚本使用对自身的引用和一组基于键输入的方法。我试图让我的游戏经理从手机接收这些信息,并让玩家切换方向——我试图让移动脚本具有静态元素,但这似乎破坏了它

有没有一个好的方法可以做到这一点,或者更可取的做法是编写一个新的移动脚本,它可以同时控制其他地方的所有玩家

目前的代码如下:

switch (direction)
            {
                case "N":
                    Instance.player1.GetComponent<Rigidbody2D>().velocity = Vector2.up * Move.speed;

                    break;
                case "E":
                    Instance.player1.GetComponent<Rigidbody2D>().velocity = Vector2.right * Move.speed;

                    break;
                case "S":
                    Instance.player1.GetComponent<Rigidbody2D>().velocity = Vector2.down * Move.speed;

                    break;
                case "W":
                    Instance.player1.GetComponent<Rigidbody2D>().velocity = Vector2.left * Move.speed;

                    break;
此函数在update中调用

损失方法:

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision != wall)
    {
        //add losing stuff
        Destroy(gameObject);
    }
}

有几种方法可以处理来自不同电话或其他来源的多个用户输入。以下是我的首选解决方案:

无论何时发送移动,所有输入都会通过一个带有玩家id的通用管理器。此输入将转换为事件以简化依赖关系。 既然您已经声明您已经有一条自定义消息发送给游戏经理,其中包含玩家编号和方向,我们将对此进行处理

在GameManager.cs或InputManager.cs中

public static event Action<int, string> OnInputReceived;

void InputReceived(int playerNumber, string direction)
{
    OnInputReceived?.Invoke(playerNumber, direction);
}
如果您的所有玩家都有唯一的ID,并且连接了PlayerMovementController,那么他们现在都可以监听输入,但只有当他们的ID绑定到输入时才能移动。如果您的游戏管理器调用InputReceived1,E,那么您的所有PlayerMovementController都将调用MovePlayer1,E,但只有playerId==1的控制器会实际移动,因为其他所有控制器都会立即返回


-Diclaimer:所有这些代码在StackOverflow中都是徒手编写的,所以可能有一些语法错误我没有发现。请让我知道或直接编辑它。

您在哪里使用静力学,为什么?如果有不同的玩家使用相同的移动脚本,那么在这些脚本中使用静态值将不起作用。@ErikOverflow是的,我想我已经删除了几乎所有与之相关的静态内容。所以你的问题是我如何分别控制不同的玩家,如果输入来自手机?我的问题是:是否有一种方法可以访问附加到另一个脚本的单独玩家的脚本,并使其使用各自的脚本对各个玩家执行操作,如果有这样的方法,最好是使用它,或者只是在一个更一般的地方重新创建移动脚本,控制所有玩家,一个脚本不附加到任何单个玩家。您可以使用一个脚本访问不同的玩家,有几种方法可以做到这一点。您可以将输入管理器配置为从指定的控制器获取输入,但如果手机是您的控制器,则可能需要创建输入管理器。我将简要地写一些东西。只需在第一个管理器代码位中检查InputReceived方法中的OnMovementInput行吗?意思是不被接受,还是指其他东西?你是对的!我会解决的。我改变了我的想法:嗯,控件似乎在工作,但它产生了与我之前测试静态时相同的问题。按照Tron制作玩家身后墙的方法没有发挥应有的作用。我对这个问题做了一个gif:这个问题与我所看到的静力学或运动逻辑无关。你能在你的问题中包含更多关于你的墙逻辑的信息吗?当方向改变时,你的代码似乎不会创建新的墙。只需将你链接到我使用的教程可能会更容易:我并没有太多偏离它
private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision != wall)
    {
        //add losing stuff
        Destroy(gameObject);
    }
}
public static event Action<int, string> OnInputReceived;

void InputReceived(int playerNumber, string direction)
{
    OnInputReceived?.Invoke(playerNumber, direction);
}
public int playerId;

void Awake()
{
    GameManager.OnInputReceived += MovePlayer;
}

void MovePlayer(int inputPlayerId, string direction)
{
    if(inputPlayerId != playerId)
        return;
    else
    {
        //move THIS player in the "direction" using your movement logic
    }
}

void OnDestroy()
{
    GameManager.OnInputReceived -= MovePlayer;
}