Unity通过字符串实例化变量



我需要通过字符串实例化变量的帮助。我需要这个根据建筑编号变量放置正确的建筑,这样我就可以使我的代码更短,更可读,而不仅仅是做许多if语句。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class main : MonoBehaviour
{
public Text cashText;
public static float cash = 0f;
public float changeCash = 0f;
public GameObject building1;
public GameObject building2;
public GameObject building3;
// Start is called before the first frame update
void Start()
{
cash = changeCash;
}
// Update is called once per frame
void Update()
{
cashText.text = "cash: " + cash.ToString();
Application.targetFrameRate = 60;
if (Input.GetKeyDown("r"))
{
Destroy(GameObject.FindGameObjectWithTag("building"));
GameObject[] projectiles = GameObject.FindGameObjectsWithTag("projectile");
foreach(GameObject projectilesfind in projectiles)
{
GameObject.Destroy(projectilesfind);
}
Instantiate("building" + menu.buildingNumber);
}
}
}

正如所说,你所要求的是可能的,这叫做"反射"。我将推荐使用NOT用这个。所以我在这里就不告诉你们怎么做了。使用链接风险自负;)


Array + index

我宁愿使用像 这样的数组
public GameObject[] buildings;

,然后再做

// assuming 1-based User input but c# arrays are 0-based
Instantiate(buildings[menu.buildingNumber - 1]);

或者如果menu.buildingNumber本身是string,则执行例如

if(int.TryParse(menu.buildingNumber, out var index))
{
Instantiate(buildings[index - 1]);
}

Dictionary + Key

或者根据你的输入,你也可以使用像

这样的字典
public GameObject building1;
public GameObject building2;
public GameObject building3;
private readonly Dictionary<string, GameObject> buildings = new Dictionary<string, GameObject>();
private void Awake()
{
buildings[nameof(building1)] = building1;
buildings[nameof(building2)] = building2;
buildings[nameof(building3)] = building3;
}

之后你可以做

if(buildings .TryGetValue("building" + menu.buildingNumber, out var building))
{
Instantiate(building);
}

请注意,虽然这是相当容易出错,你将不得不重命名您的字段/字符串在TryGetValue根据您的需要所有的时间

最新更新