具有通过附加脚本控制的脚本的 Unity 控件对象



我遵循了为我的项目制作Tron游戏的教程,我想添加多人游戏功能。我已经建立了一个消息系统,其中手机向显示游戏的计算机发送方向更改,然后让他们的玩家改变方向。每个玩家都通过附加的"Move"脚本进行控制,该脚本使用对自身的引用和一组基于关键输入的方法。我试图让我的游戏经理从手机接收这些消息并让玩家切换方向 - 我尝试让移动脚本具有静态元素,但这似乎破坏了它。

有没有一种好的方法可以做到这一点,或者最好编写一个新的移动脚本来同时控制所有玩家,而该脚本只是附加在其他地方?

当前代码如下:

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;

Move 是对附加到每个游戏的脚本的引用,但要使脚本正常运行,需要在每次方向更改后调用此方法:

public void spawnWall()
{
lastWallEnd = transform.position;
GameObject objectOfGame = (GameObject)Instantiate(wallPrefab, transform.position, Quaternion.identity);
wall = objectOfGame.GetComponent<Collider2D>();
}

我试图让它静态,但它不起作用,所以我猜这不是要走的路线。每次进行内部方向更改时都会调用生成墙。

void createConstantWall(Collider2D collision, Vector2 start, Vector2 finish)
{
collision.transform.position = start + (finish - start) * 0.5f;
float distance = Vector2.Distance(start, finish);
if (start.x != finish.x)
collision.transform.localScale = new Vector2(distance + 1, 1);
else
collision.transform.localScale = new Vector2(1, distance + 1);
}

此函数在更新中调用

损失方法:

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

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

  • 每当发送移动时,所有输入都会通过带有玩家 ID 的通用管理器。此输入将转换为事件以简化依赖项。

由于您已经声明您已经向游戏管理器发送了一条包含玩家编号和方向的自定义消息,因此我们将对其进行处理。

在您的游戏管理器中.cs或输入管理器.cs

public static event Action<int, string> OnInputReceived;
void InputReceived(int playerNumber, string direction)
{
OnInputReceived?.Invoke(playerNumber, direction);
}

在 PlayerMovementController 中.cs应该附加到游戏中的每个玩家,您应该跟踪您的玩家 ID,或者能够检查 playerId 的另一个附加脚本:

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;
}

如果您的所有玩家都有唯一的 ID 并附加了 PlayerMovementController,他们现在可以监听输入,但只有在他们的 ID 绑定到输入时才会移动。如果你的 GameManager 调用 InputReceived(1,"E"(,你所有的 PlayerMovementControllers 都会调用 MovePlayer(1, "E"(,但只有 playerId == 1 的控制器才会真正移动,因为所有其他控制器都会立即返回。

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

最新更新