我试着把我的游戏设置到有玩家的地方,你触摸屏幕来投掷物体,一旦这个物体与另一个物体碰撞,分数就会增加1分。我向实例化的对象添加了一个脚本,当检测到冲突时,该脚本将打印一条消息到控制台。该脚本还引用了另一个保存score变量的脚本。
脚本是:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CrackEgg : MonoBehaviour
{
public Stats stats;
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "BreakEgg")
{
stats.DepositMoney();
Debug.Log("I am actually working");
}
}
}
Stats脚本为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Stats : MonoBehaviour
{
[Header("Bank")]
public int bankAmount;
public int depositAmount;
public void DepositMoney()
{
bankAmount += depositAmount;
}
}
我知道我必须将Stats脚本附加到游戏对象(我将其附加到一个空游戏对象)。抛出的对象是一个预制对象,并具有作为组件的CrackEgg
脚本。我尝试将Stats游戏对象拖到CrackEgg
脚本的Stats字段中,但不起作用。只有当Stats游戏对象也是预置对象时,它才起作用。我遇到的主要问题是,即使我在层次结构中预置了Stats游戏对象,当我测试代码时,bankAmount
变量根本不会增加。总而言之,我希望实例化的对象检测到冲突,然后从Stats脚本运行DepositMoney()
方法,但无法找到使其工作的方法。
发布于 2021-01-18 20:40:52
快速检查:在场景中创建CrackEgg
。尝试将Stats
对象拖动到字段中。应该能行得通。现在拖动此CrackEgg
到项目视图,以创建一个预制。预制板上的Stats
字段为空。为什么?
可以在游戏中的任何位置实例化预置,因此在预置在另一个场景中实例化的情况下,对场景对象的引用可能无效。因此,您必须在运行时获取对Stats
对象的引用。
您可以通过两种方式完成此操作:
方法1
使用"Stats“标记标记您的Stats
对象。
然后,无论何时启动CrackEgg
,都可以在场景中找到它。
class CrackEgg : MonoBehaviour {
void Start() {
stats = GameObject.FindGameObjectWithTag("Stats").GetComponent<Stats>();
}
}
方法2
使您的Stats
类成为静态类,而不是MonoBehaviour组件。
public class Stats
{
private static int bankAmount;
public static void DepositMoney(int depositAmount)
{
bankAmount += depositAmount;
}
}
然后,您不需要将其添加到任何对象中,因为程序中的每个参数都只有一个实例。这是分数类的常见模式。要访问它,您不需要存储对Stats
的引用,只需使用类名:
if (collision.gameObject.tag == "BreakEgg")
{
Stats.DepositMoney(depositAmount);
Debug.Log("I am actually working");
}
因为你不能在编辑器中给静态类赋值,所以我建议修改一下,让调用者在调用时定义押金数量。您可能需要考虑安全问题(不允许值超出范围等)。
此外,通常建议您使用CompareTag
而不是==
:https://answers.unity.com/questions/200820/is-comparetag-better-than-gameobjecttag-performanc.html
https://stackoverflow.com/questions/65770211
复制相似问题