【发布时间】:2020-01-09 02:28:49
【问题描述】:
我遵循了为我的项目制作 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;
Move 是对每个游戏附带的脚本的引用,但要使脚本发挥作用,每次改变方向后都需要调用此方法:
public void spawnWall()
{
lastWallEnd = transform.position;
GameObject objectOfGame = (GameObject)Instantiate(wallPrefab, transform.position, Quaternion.identity);
wall = objectOfGame.GetComponent<Collider2D>();
}
我试图将其设为静态,但它不起作用,所以我猜这不是要走的路。每次内部方向改变时都会调用 SpawnWall。
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);
}
}
【问题讨论】:
-
你在哪里使用静力学,为什么?如果有不同的玩家使用相同的移动脚本,则在这些脚本中使用静态值将不起作用。
-
@ErikOverflow 是的,我想到了,所以我已经删除了几乎所有与之相关的静态内容。
-
所以你的问题是“如果输入来自手机,我如何分别控制不同的玩家?”span>
-
我的问题是:有没有一种方法可以访问附加到将玩家与另一个脚本分开的脚本,并使其使用各自的脚本对各个玩家执行操作,如果有这样的事情,最好是使用它还是只是在一个更通用的地方重新创建移动脚本来控制所有玩家,一个脚本不附加到任何单个玩家。
-
你可以有一个脚本来访问不同的播放器,有几种方法可以做到这一点。您可以将输入管理器配置为从指定的控制器获取输入,但如果手机是您的“控制器”,那么您可能需要创建一个输入管理器。我会简单地写一些东西。