繁体   English   中英

无法从具有脚本的空游戏对象获取变量

[英]can't get variable from an empty game object with script

我试图从一个空的gameObject的脚本中获取变量,但无法在检查器上分配该gameObject。 这些是我的游戏的屏幕截图和代码。

好吧,我有这个代码在游戏开始时加载。 Land和Prince是根据此代码制成的对象。

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;


public class loadGame : MonoBehaviour 
{
    public static loadGame loadSave;

    public GameObject objPrince;
    public Pangeran charPrince;
    public Transform prefPrince;

    public Sprite[] spriteTanah;
    public Dictionary<string, Tanah> myTanah = new Dictionary<string, Tanah>();
    public Dictionary<string, GameObject>objTanah = new Dictionary<string, GameObject>();
    public Tanah tempTanah;
    public GameObject tempObjTanah;
    public Transform prefTanah;
    public float mapX;
    public float mapY;
    public int i = 0;
    public int j = 0;
    public int rows = 9;
    public int column = 9;

    void Awake(){
        if(loadSave == null)
        {
            DontDestroyOnLoad(gameObject);
            loadSave = this;
        }
        else if(loadSave != this)
            Destroy(gameObject);

    }

    // Use this for initialization
    void Start () 
    {
        Load ();   
    }

    // Update is called once per frame
    void Update () 
    {       
    }

    public void Load()
    {
        if(File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
        {

        }
        else
        {
            charPrince = new Pangeran ("Prince", "04Okt1993", 0, 0, 0, 0, 0, false, false);
            objPrince = GameObject.Instantiate (prefPrince, new Vector3 (0, 0, 0), Quaternion.identity) as GameObject;
            //objPrince.name = "Prince";
            charPrince.locationY = 0f;
            charPrince.locationX = 0f;
            charPrince.hadapAtas = false;
            charPrince.hadapKanan = true;
            charPrince.stamina = 100f;
            charPrince.exp = 0f;
            charPrince.speed = 0f;

            for(i = 0 ; i < rows ; i ++)
            {
                for(j = 0; j<column ; j++)
                {
                    mapX = (i-j) * 0.8f;
                    mapY = (i+j) * 0.4f;

                    if(i>=1 && j>=1 && i<=5 && j<=5)
                    {
                        prefTanah.name = "land-"+j.ToString("0#")+"-"+i.ToString("0#");
                        tempTanah = new Tanah("land-"+j.ToString("0#")+"-"+i.ToString("0#"),mapX,mapY,"land",spriteTanah[0],spriteTanah[1],spriteTanah[2]);
                        myTanah.Add("land-"+j.ToString("0#")+"-"+i.ToString("0#"),tempTanah);
                        tempObjTanah = GameObject.Instantiate(prefTanah, new Vector3(mapX,mapY,0),Quaternion.identity)as GameObject;
                        objTanah.Add("land-"+j.ToString("0#")+"-"+i.ToString("0#"),tempObjTanah);
                    }
                    else
                    {
                        prefTanah.name = "snow-"+j.ToString("0#")+"-"+i.ToString("0#");
                        tempTanah = new Tanah("snow-"+j.ToString("0#")+"-"+i.ToString("0#"),mapX,mapY,"snow");
                        myTanah.Add("snow-"+j.ToString("0#")+"-"+i.ToString("0#"),tempTanah);
                        tempObjTanah = GameObject.Instantiate(prefTanah, new Vector3(mapX,mapY,0),Quaternion.identity)as GameObject;
                        objTanah.Add("snow-"+j.ToString("0#")+"-"+i.ToString("0#"),tempObjTanah);
                    }
                }
            }

        }
    }
}

我正在尝试从上面的代码访问某些变量之一,但无法在检查器中分配它。

我想在上面的代码中分配该代码

但是我做不到 而这发生了

请帮我。 谢谢。

问题在于loadLand变量的类型为LoadGame,这是一个脚本。 您要尝试的是将GameObject添加到此变量。 因此,将公共变量类型更改为

public GameObject LoadLandObject;
private LoadGame loadLand;

并创建一个私有LoadGame变量,该变量是对脚本的引用。 添加Start()方法

loadLand = (LoadGame)LoadLandObject.GetComponent<LoadGame>();

这样,您将GameObject的脚本LoadGame加载到变量中。

您是否将plantingScript.loadLand设置为loadGame.loadSave的实例? 在您的情况下,必须在“ Awake之后执行此操作,以确保已设置实例。

我可以问一下,你想做什么?

您只需要在plantingScript的检查器中分配loadGame脚本,而根本不使用静态变量。 他们迟早会咬你的屁股(我猜是已经咬了)。

有类似的问题。 找不到简单明了的解决方案。 可能是我为您提供的帮助。

  1. 创建空的游戏对象。
  2. 将loadGame.cs附加到它(如果您想控制脚本何时启动-取消选中它,在这种情况下,请不要在需要时在plantingScript中将loadLand.enabled设置为true)
  3. 将此对象拖动到您的loadLand字段

样例项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM