为什么在统一访问另一个类变量时需要附加或引用和对象?

时间:2015-05-26 02:50:46

标签: c# unity3d unityscript

例如,如果我想访问另一个类中的整数运行状况,我必须创建该类的引用并将其附加到检查器中的对象或以编程方式附加到对象。为什么我不能在不附加对象的情况下访问公共整数?示例代码

 public class Game : MonoBehaviour
 {
 public int health;
 }

 public class player : MonoBehaviour
 {
 public Game gameScript;
 gameScript.health = 10;  //this will cause nullpointer error if not attached to a gameobject or
                          //public GameObject test;
                          //gameScript = test.GetComponent<testscript> ();

 }

2 个答案:

答案 0 :(得分:4)

能够 访问其他值,不要将附加到 GameObject ,您必须制作确保您没有继承 MonoBehaviour 。继承 MonoBehaviour 后,您不再能够访问 其他脚本中的值或功能。这就是Unity的制作方式。

所以改变:

public class Game : MonoBehaviour
 {
 public int health;
 }

public class Game
 {
 public int health;
 }

此外,在访问该值之前,您必须使用 new 关键字,否则您的类将为null并导致程序崩溃。

public Game gameScript;
 gameScript.health = 10;

应该更改为:

public Game gameScript = new Game();
 gameScript.health = 10;

由于您将从其他课程访问您的课程,因此您需要使您的健康变量静态并直接访问。如果不这样做,每次使用关键字时,您都会有许多健康变量实例。

通过将变量设为静态,您可以直接执行Game.health = 10;而无需使用关键字或创建其他实例。以下是一个例子:

 public class Game
 {
 public static int health;
 }

然后您可以使用

访问它
Game.health = 10;

修改

获取/设置方法

 public class Game
     {
     public static int health;

    public static int getHealth(){
    return Game.health;
    }

    public static void setHealth(int tempHealth){
    Game.health = tempHealth;
      }
    }

然后从其他类访问它,你可以这样做:

Debug.Log(Game.getHealth().toString());

修改,

Game.setHealth(10);

我确实编译了这个,但它应该有效。

答案 1 :(得分:0)

对此,你必须实例化游戏对象,但是如果你想将其改为允许,请将其更改为:public static int health;或者使用getter / setter方法来检索此值“health”。 C ++和Java必须具有实例化对象以从中检索以设置值/从任何属性获取值。