【问题标题】:Accessing other script method from instantiated object [duplicate]从实例化对象访问其他脚本方法[重复]
【发布时间】:2021-01-18 07:14:31
【问题描述】:

我正在尝试将我的游戏设置为有玩家的地方,您触摸屏幕以投掷物体,一旦该物体与另一个物体发生碰撞,得分就会增加 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");
        }
    }

}

统计脚本是:

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() 方法,但我无法找到使其工作的方法。

【问题讨论】:

    标签: c# visual-studio unity3d visual-studio-2019


    【解决方案1】:

    快速检查:在现场创建CrackEgg。尝试将Stats 对象拖到字段中。它应该工作。现在将这个CrackEgg 拖到项目视图中以创建一个预制件。 Stats 字段在预制件上为空。为什么?

    预制件可以在游戏中的任何位置实例化,因此如果预制件在另一个场景中实例化,对场景对象的引用可能无效。 所以你必须在运行时获取对Stats对象的引用。

    您可以通过两种方式实现:

    方法一

    使用“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

    【讨论】:

    • 这里假设整个场景中只有一个 Stats 实例
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2016-04-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2012-12-27
    相关资源
    最近更新 更多