首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从实例化的对象访问其他脚本方法

从实例化的对象访问其他脚本方法
EN

Stack Overflow用户
提问于 2021-01-18 15:14:32
回答 1查看 136关注 0票数 0

我试着把我的游戏设置到有玩家的地方,你触摸屏幕来投掷物体,一旦这个物体与另一个物体碰撞,分数就会增加1分。我向实例化的对象添加了一个脚本,当检测到冲突时,该脚本将打印一条消息到控制台。该脚本还引用了另一个保存score变量的脚本。

脚本是:

代码语言:javascript
运行
复制
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脚本为:

代码语言:javascript
运行
复制
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()方法,但无法找到使其工作的方法。

EN

回答 1

Stack Overflow用户

发布于 2021-01-18 20:40:52

快速检查:在场景中创建CrackEgg。尝试将Stats对象拖动到字段中。应该能行得通。现在拖动此CrackEgg到项目视图,以创建一个预制。预制板上的Stats字段为空。为什么?

可以在游戏中的任何位置实例化预置,因此在预置在另一个场景中实例化的情况下,对场景对象的引用可能无效。因此,您必须在运行时获取对Stats对象的引用。

您可以通过两种方式完成此操作:

方法1

使用"Stats“标记标记您的Stats对象。

然后,无论何时启动CrackEgg,都可以在场景中找到它。

代码语言:javascript
运行
复制
class CrackEgg : MonoBehaviour {
    void Start() {
        stats = GameObject.FindGameObjectWithTag("Stats").GetComponent<Stats>();
    }
}

方法2

使您的Stats类成为静态类,而不是MonoBehaviour组件。

代码语言:javascript
运行
复制
public class Stats
{
    private static int bankAmount;

    public static void DepositMoney(int depositAmount)
    {
        bankAmount += depositAmount;
    }
}

然后,您不需要将其添加到任何对象中,因为程序中的每个参数都只有一个实例。这是分数类的常见模式。要访问它,您不需要存储对Stats的引用,只需使用类名:

代码语言:javascript
运行
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65770211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档