unity脚本中变量在另一个脚本如何调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity脚本中变量在另一个脚本如何调用相关的知识,希望对你有一定的参考价值。

在unity中我在一个脚本A.cs中算出了一条路径并在每个路径节点上实例化一个Cube并且用一个Arraylist数组保存这些Cube,然后我要在另一个脚本B.cs上如何调用这个保存Cube实例的arraylist数组(就是在另一个脚本中操作这个Arraylist并删除arraylist里面的Cube)。
我最初是把在A.cs中的arraylist如是定义;
static public ArrayList Roadnode;
然后经过一系列的操作Roadnode中保存着路径节点上的Cube。
我在B.cs中这样写:
protected A a;
在Start()中
a = GetComponent<A>();
然后 我这样测试Debug.Log(A.Roadnode.Count);然后就报错:NullReferenceException: Object reference not set to an instance of an object,为什么呢,该如何获取Roadnode数组呢,求指点,在线等;

1.新建两个脚本,在脚本2中实例化脚本1。

2.在脚本2中用脚本1实例化对象调用脚本1中的公有变量,赋初值。

3.创建两个物体,将两个脚本绑定不同物体。

4.将物体1拖拽到脚本2的变量上进行赋值。

参考技术A

1、首先我们创建一个新的项目。

2、在Layout下选择2 by 3,如图所示。

3、此时我们切换到Project面板。

4、在Project面板空白处右键选择create》C#,,如图。

5、创建完成,可以自行命名。

6、双击打开即可编写脚本。

参考技术B 不太清楚实际情况,但是,
(1)你这样写的前提是,A 和 B 必须同时实例化到同一个gameObject上(这两个脚本得同时应用到一个物体上),否则你的a = GetComponent<A>()肯定为null ,因为B调用这个Get,而他本身所处的gameObject本没有A这个脚本组件,A的实例在另一个物体上。 估计这是你报错的一个原因。
(2)用static声明全局变量似乎没必要,static的作用应该是让变量在类被实例之前就得到实例化。用static的话,那么应该是要达到这样的目的,即用类名直接调用变量或函数(Mathf类里面的很多数学数值和函数都是这样的例子),你这个情况如果用了static那就最好应该为了这样的目的:
A.Roadnode.count
(3)实时操作数组,最好用List<>,具体可以参考msdn List的用法,
(4)如果你的目的只是为了让B能够通过代码访问A的变量,一般的public 变量就足够,其余你只需要解决B通过何种途径正确访问A。比如,你可以把A做成singleton:
static A instance;
Awake() instance = this;),让A有一个static实例指向自己, 那B就直接用 A.instance 来获取A的实例,这样就可以在任何地方直接访问A的变量和函数。

又或者用 GameObject.Find("名字") 遍历所场景中所有有的对象,最后用GetComponent找到A的实例,这个方法效率很低,最好是在初始化函数里调用。追问

我的两个脚本是绑定在同一个gameobject上的,然后我试了一下说的第四点:
//A.cs
static public A instance;Awake() instance = this;
在B.cs中
Update() Debug.Log("Seeker.Roadnode.Count::" + Seeker.seek.Roadnode .Count );,如果你的意思是这样,还是一样的错误

追答

如果你是用A做类名, 哪就应该是:
A.Roadnode.Count。
instance 是A的实例名!你调用的时候要用类名。它指向它自己的A类实例,这是singleton 模式,如果场景中存在多个A类实例就会出问题, instance就会仅指向最后一个被实例化的A类实例。比如,你如果有3个包含A的GO,那么在顺序上,instance只会指向时间上最后一个生成的A实例。

Singleton的目的是把A类的实例固定为唯一,并限定A类只能有一个实例,再用static public暴露他的调用,让场景中所有类都可以随时调用A的实例。我给你的那个例子是简化版本的。理论上整个场景中应该仅允许存在一个A类的实例化。这样做相当于unity 本身的脚本的类, 比如Mathf,Physics(建议查下singleton相关的知识)

如果你两个脚本打算放在一个GO上,建议直接用 GetComponent调用, 而不是用Singleton模式。如果你用Singleton模式,最好把A类单独放到一个空GO上。我之前说的几个方法是因为我不知道你具体要怎样应用。

本回答被提问者和网友采纳
参考技术C 在A.js中用静态声明 static var 变量:bool;
然后在B.js中直接用 B.变量 调用;
或者用 GameObject.Find("gameobject名字").GetComponent(A).变量 调用;追问

我用C#写的你给我js的,这个答案貌似在论坛上也见过。。。

Unity.3D中,两个界面各自脚本中的变量如何调用

初学

如何把一个对象文本里面的值传递到另外一个对象文本上:

1、在需要被调用的文本中声明静态变量,在文本中给静态变量赋值,然后在调用的文本中用类名调用,程序关闭后,程序自动删除静态变量所赋的值;

  例如最简单的注册和登录界面:

    //在注册界面绑定脚本Register:

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

public class RegisterGame : MonoBehaviour

{

  public static string userName;//存储名字

  public static string password;//存储密码

  public InputField nameInput;//名字输入框

  public InputField pswInput;//密码输入框

      //声明一个绑定确认按钮的方法,给静态变量赋值

  public void RegisterButton()

  {

  userName =nameInput.text;

  password = pswInput.text;

  //界面转换省略

  }

}

//在登录界面绑定脚本Game:

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

public class Game : MonoBehaviour

{

  public GameObject registerPannel;//两个界面关联

  public InputField nameInput;//输入姓名框

  public InputField pswInput;//输入密码框

  public void LandingButton()

  {

     if (nameInput.text!=Register.userName) //直接用类名调取静态变量

    {

    aletText.text = "用户名不存在";

    }

    else if (pswInput.text!=Register.password)

    {

    aletText.text = "密码错误";

    }

    else {

    //去主界面

    print("去主界面");

    }  

  }

}

2、在程序的缓存集里面存数据PlayerPrefs,程序结束后保存本地;

在被调用脚本中获取值PlayerPrefs.SetString(String Key,String Input)

在调用脚本中利用String key 获取值 PlayerPrefs.GetString(String Key)

代码如上稍作更改:

在注册界面:

  public void RegisterButton()

  {

  PlayerPrefs.SetString("123",nameInput.text);//获取输入的名称

  }

  在登陆界面:

  public void LandingButton()

  {

  //获取变量

  PlayerPrefs.GetString("123");

  }  

这是我在初学的时候所作的笔记,曾经这个问题困扰我两天,可能资质比较愚钝,上网搜索也没有搜索到解决方式;

希望学代码的人或者前辈高手,保持初心;

祝事业有成

 

以上是关于unity脚本中变量在另一个脚本如何调用的主要内容,如果未能解决你的问题,请参考以下文章

Unity.3D中,两个界面各自脚本中的变量如何调用

unity中怎样让一个对象切换脚本

unity3d 全局单例脚本怎么用

在另一个脚本的 Start() Unity C# 之后执行一个脚本的 Start()

Unity脚本调用其他GameObject游戏对象

在 Unity 中,如何将值从一个脚本传递到另一个脚本?