我不知道如何与其他脚本通信



我有一个Player脚本。上有变量

public class Player : MonoBehaviour
{
float horimove;
Rigidbody rb;
public float speed;
public GameObject thrown;
public bool win;

在我的另一个脚本中(我正在制作一个游戏,你可以将球体实例化为一个洞并获胜。(

public class spheresciprt : MonoBehaviour
{
public Player pscript;
public GameObject player;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find("Player");
pscript = player.GetComponent<Player>();
}
private void OnTriggerEnter(Collider other)
{
if (gameObject.CompareTag("win"))
{
pscript.win = true;
}
}

但是pscript.win没有改变。bool总是保持错误,但我希望玩家在球体击中我希望它进入的洞的触发器后获胜。我尝试了不同的计算机。同样的事情发生在不同的比赛中,我想我可能只是错过了一些东西。

首先,确保检测到碰撞。你可以很容易地做一些类似的事情

void OnTriggerEnter()
{
Debug.Log("Pass1");
if (gameObject.CompareTag("win"))
{
Debug.Log("Hey, it worked!");
}
}

在OnTriggerEnter中进行检查。

如果未检测到碰撞,请确保所有受影响的游戏对象上都有碰撞器,球体上也有刚体组件。此外,请确保碰撞器标记为"触发器"。如果您对此仍有问题,我们需要联系您的检查员来解决。

如果检测到碰撞。。。好吧,首先要确保你在洞上分配了正确的标签。然后,确保玩家GameObject实际上被称为";玩家";(因为你试图按名称找到它(,并且它有你试图在你实际找到的对象上获得的脚本(而不是在它的一个子对象上(。我希望它能起作用,因为我看不出你的代码中有任何其他严重的缺陷。

您是否尝试更改

if(gameObject.CompareTag("win"((

if(collider.gameObject.CompareTag("win"((

或者只是将刚体添加到玩家和其他对象中。另一个对象是否具有";获胜";标签

这是您的脚本:

public class spheresciprt : MonoBehaviour
{
public Player pscript;
public GameObject player;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find("Player");
pscript = player.GetComponent<Player>();
}
private void OnTriggerEnter(Collider other)
{
if (gameObject.CompareTag("win"))
{
pscript.win = true;
}
}
}

它将pscript设置为播放机脚本中的当前值。这就是问题所在,因为它将变量设置为当前值,并且您希望访问该组件。您可以通过将所有pscript变量替换为player.GetComponent<Player>()来更改这一点。还有其他方法可以做到这一点。您可以在OnTriggerEnter的末尾添加以下内容:

void OnTriggerEnter(Collider other)
{
...
player.GetComponent<Player>() = pscript;
}

在这两种解决方案中,你都可以修复它。在其中一种方案中,重新应用变量。在另一种情况下,直接更改零部件。这就是您想要的,因为您将pscript作为播放器脚本的实例,而不是附加到播放器的播放器脚本。

最新更新