我如何找到文件夹中的所有脚本化对象,然后从其中加载一个变量?
How do I find all Scriptable Objects in a folder and then load a variable from one?
我的统一项目中有一个文件夹在“Resources/ScriptableObjects/Skins”下。我需要获取文件夹中的所有对象,为索引生成一个随机数,然后将精灵分配给脚本附加到的现有游戏对象。我得到的当前错误是第 151 行的“NullReferenceException:未将对象引用设置为对象的实例”,但我正在第 149 行创建对象的实例。是什么原因造成的?这是我的函数,用于将文件夹中随机脚本对象中的精灵分配给脚本绑定的游戏对象:
void AssignRandomSkin(){
// Load all skins into memory
Object[] skinObjects = Resources.LoadAll("ScriptableObjects/Skins");
// Get length of list
int amountOfSkins = skinObjects.Length;
// Get random index of skin to assign
int skinToAssignIndex = Random.Range(0, amountOfSkins);
GameObject thisSkin = Instantiate(skinObjects[skinToAssignIndex]) as GameObject;
// Assign it to game object
gameObject.GetComponent<SpriteRenderer>().sprite = thisSkin.GetComponent<Sprite>();
}
这是脚本对象:
using UnityEngine;
[CreateAssetMenu(fileName = "Skin", menuName = "ScriptableObjects/SkinObject", order = 1)]
public class SkinObject : ScriptableObject
{
public string spriteName; // Name of sprite
public Sprite sprite;
public float xPos;
public float yPos;
public float zPos;
public float xScale;
public float yScale;
public float zScale;
public float fallSpeed; //AKA Weight
public string tier; //Category that skin can be assigned in
}
那么这里发生了什么?
您的对象是 ScriptableObject,类型为 SkinObject
! => 它们 不是 GameObject
预制件!
在
之前,代码中的所有内容都应该可以正常工作
GameObject thisSkin = Instantiate(skinObjects[skinToAssignIndex]) as GameObject;
首先没有必要实例化一个ScriptableObject
。这只会创建资产的克隆,但您不需要它。
其次,您试图将其转换为 GameObject
。如前所述,这是类型不匹配,因此 thisSkin
将是 null
!
最后 Sprite
是没有组件的。您更愿意访问 字段 .sprite
您的 SkinObject
类型。
我很确定它应该是
// You can directly tell LoadAll to only load assets of the correct type
// even if there would be other assets in the same folder
SkinObject[] skinObjects = Resources.LoadAll<SkinObject>("ScriptableObjects/Skins");
var thisSkin = skinObjects[Random.Range(0, skinObjects.Length)];
// Assign it to game object
gameObject.GetComponent<SpriteRenderer>().sprite = thisSkin.sprite;
但是,如前所述,从Best Practices - Resource Folder 不要使用它!
为什么不通过 Inspector 在
这样的字段中以通常的方式简单地引用这些 ScriptableObjects
public SkinObject[] availableSkins;
我的统一项目中有一个文件夹在“Resources/ScriptableObjects/Skins”下。我需要获取文件夹中的所有对象,为索引生成一个随机数,然后将精灵分配给脚本附加到的现有游戏对象。我得到的当前错误是第 151 行的“NullReferenceException:未将对象引用设置为对象的实例”,但我正在第 149 行创建对象的实例。是什么原因造成的?这是我的函数,用于将文件夹中随机脚本对象中的精灵分配给脚本绑定的游戏对象:
void AssignRandomSkin(){
// Load all skins into memory
Object[] skinObjects = Resources.LoadAll("ScriptableObjects/Skins");
// Get length of list
int amountOfSkins = skinObjects.Length;
// Get random index of skin to assign
int skinToAssignIndex = Random.Range(0, amountOfSkins);
GameObject thisSkin = Instantiate(skinObjects[skinToAssignIndex]) as GameObject;
// Assign it to game object
gameObject.GetComponent<SpriteRenderer>().sprite = thisSkin.GetComponent<Sprite>();
}
这是脚本对象:
using UnityEngine;
[CreateAssetMenu(fileName = "Skin", menuName = "ScriptableObjects/SkinObject", order = 1)]
public class SkinObject : ScriptableObject
{
public string spriteName; // Name of sprite
public Sprite sprite;
public float xPos;
public float yPos;
public float zPos;
public float xScale;
public float yScale;
public float zScale;
public float fallSpeed; //AKA Weight
public string tier; //Category that skin can be assigned in
}
那么这里发生了什么?
您的对象是 ScriptableObject,类型为 SkinObject
! => 它们 不是 GameObject
预制件!
在
之前,代码中的所有内容都应该可以正常工作GameObject thisSkin = Instantiate(skinObjects[skinToAssignIndex]) as GameObject;
首先没有必要实例化一个ScriptableObject
。这只会创建资产的克隆,但您不需要它。
其次,您试图将其转换为 GameObject
。如前所述,这是类型不匹配,因此 thisSkin
将是 null
!
最后 Sprite
是没有组件的。您更愿意访问 字段 .sprite
您的 SkinObject
类型。
我很确定它应该是
// You can directly tell LoadAll to only load assets of the correct type
// even if there would be other assets in the same folder
SkinObject[] skinObjects = Resources.LoadAll<SkinObject>("ScriptableObjects/Skins");
var thisSkin = skinObjects[Random.Range(0, skinObjects.Length)];
// Assign it to game object
gameObject.GetComponent<SpriteRenderer>().sprite = thisSkin.sprite;
但是,如前所述,从Best Practices - Resource Folder 不要使用它!
为什么不通过 Inspector 在
这样的字段中以通常的方式简单地引用这些 ScriptableObjectspublic SkinObject[] availableSkins;