【问题标题】:Method in Script is never called脚本中的方法永远不会被调用
【发布时间】:2015-12-06 02:07:49
【问题描述】:

我有一个附加到游戏对象的 Projectile 脚本。现在我想从附加到游戏对象 A 的脚本 A 访问 Projectile 脚本中的 LinearProjectile() 方法。这里我在脚本 A 中创建了一个 Projectile 类型的公共字段,并传入一个附加了 Projectile 脚本的游戏对象。

要访问我刚刚做的 LinearProjectile() 方法。

projectile.LinearProjectile(transform.position, transform.rotation, this.direction, this.shotPower);
//Here is my method defination..

public void LinearProjectile(Vector3 position, Quaternion rotation, Vector2 direction, float force)
{
    Debug.Log("called");
    this.direction = direction;
    this.force = force;
    this.projectileType = ProjectileType.Linear;
}

在这个方法中分配的所有字段值都处于默认状态,因为这个方法永远不会被调用。如何从其他 GameObject 脚本访问此方法。 我尝试了 GetComponent().method() 但即使我无法访问这里的错误是什么?我花了很多时间找出来但没有成功..帮帮我

【问题讨论】:

  • LinearProjectile() 在哪里?在Projectile 脚本中?如果是这样,你想在哪里访问LinearProjectile()
  • 这是 Projectile Script 的一种方法,我想从 Script A 访问。

标签: c# unity3d


【解决方案1】:

提供了这样一个场景:

  • 我们在场景中有一个GameObject,我们称之为Item
  • 我们已将ProjectileScript 附加到Item
  • 我们有一个A 脚本附加到Item

我们需要做的就是在A脚本内部调用:

gameObject.GetComponent<ProjectileScript>().LinearProjectile();

如果它在另一个GameObject 上,我会亲自在脚本A 中创建字段以用于Inspector,例如:public GameObject ProjectileScriptHolder,然后只需将GameObject 从包含ProjectileScript 的场景拖到Inspector 中的那个变量并以这种方式访问​​它:

ProjectileScriptHolder.GetComponent<ProjectileScript>().LinearProjectile();

我还会在调用方法之前检查每个 GetComponent&lt;T&gt;,因为它可能返回 null,即:

ProjectileScript script = ProjectileScriptHolder.GetComponent<ProjectileScript>();
if (script != null)
    script.LinearProjectile();

如果您无法通过Inspector 附加项目,您可以使用FindWithTag() 并在场景中找到GameObject,前提是它已正确附加TagFindWithTag()string 为参数,将在场景中寻找带有此类标签的GameObject

【讨论】:

    【解决方案2】:

    我了解到您想从另一个游戏对象上的另一个脚本访问一个脚本!

    方式 1

    有一种简单的方法可以做到这一点,即缓存脚本。 (假设脚本名称为:“ProjectileScript”)

    在 ScriptA 上创建一个

    public ProjectileScript pS;
    

    你需要初始化它,有两种方法: 1- 在 GameObjectA 的检查器上,使用 projectileScript 拖动 GameObject。

    2.1- 如果脚本在同一个游戏对象中:

    pS = GetComponent<ProjectileScript> ();
    

    2.2- 如果它在另一个游戏对象上,您可能需要以某种方式找到该对象。考虑使用标签

     pS = GameObject.FindGameObjectWithTag("projectile").GetComponent<"ProjectileScript">(); 
    

    并在脚本 A 中强制转换:

    pS.LinearProjectile();
    

    方式 2

    或者您可以使用 ProjectileScript 在 GameObject 上制作一个通用标签并以这种方式找到它:

    GameObject.FindGameObjectWithTag("projectile").GetComponent<"ProjectileScript">.LinearProjectile();
    

    这对你有意义吗?对不起我的英语。

    【讨论】:

    • 不。我仍然无法访问。在 pS 类型的 projectileScript unity 中,会抛出附加到 GameObject 而不是 GameObject 的 projectileScript 实例。所以可以直接调用 pS.LinearProjectile()。如果我错了,请纠正我。但我不知道为什么我无法访问 LinearProjectile() 方法..
    • 哎呀。我忘了启动它。 :O
    • 我已经更新了代码。我在括号上犯了一些错误。对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多