unity3d 添加变量到一个预置的转换脚本,如何?

yhived7q  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(140)

因此,我能够在运行时示例化新对象,它们会在附加了正确脚本的情况下生成,但脚本现在会在其插槽中固定变量的情况下生成。
我需要一种方法来产生附加脚本的预制件,并且脚本中的变量槽都已填充。

部署胶囊脚本(链接到主摄像机)

public class deployCapsule : MonoBehaviour
{
    public GameObject CapsulePrefab;
    public Path path;
    public float respawnTime = 1.0f;

    void Start()
    {
        StartCoroutine(capsuleWave());
    }

    private void spawnCap()
    {
        GameObject a = Instantiate(CapsulePrefab) as GameObject;
        a.transform.position = new Vector2(1.0f, 1.0f);
        path.followers.Add(a);
        Debug.Log("1");
    }

    IEnumerator capsuleWave()
    {
        while (true)
        {
            yield return new WaitForSeconds(respawnTime);
            spawnCap();
        }
    }
}

路径跟随器脚本

public class PathFollower : MonoBehaviour
{
    public float movementSpeed;
    //private float pathProgress = 0;
    public GameObject objectToSpawn;
    public Transform[] positionPoint;
    [Range(0,1)]
    public float value;

    void Start()
    {
        Debug.Log(iTween.PathLength(positionPoint));
    }

    void Update()
    {
        movementSpeed = 10f;
        if (value < 1)
        {
            value += Time.deltaTime / movementSpeed;
        }
        iTween.PutOnPath(objectToSpawn, positionPoint, value);
    }

    private void OnDrawGizmos()
    {
        iTween.DrawPath(positionPoint,Color.green);
    }
}

我知道这在技术上是不可能的。但我需要一种方法来完成这件事。
我对团结是相当新的,并将感谢给予的任何帮助。提前感谢你。

im9ewurl

im9ewurl1#

在deployCapsule中,存储对点数组的引用

public Transform[] positionPoint;

在检查器中分配值。
一旦你示例化了这个预置,就给予它一个数组

//this is in the SpawnCap function
//GameObject a = Instantiate(CapsulePrefab) as GameObject;
a.GetComponent<PathFollower>().positionPoint = positionPoint;
//rest of your function

或者,通过获取对具有数据的类的引用,设置新示例化的Capsule的Awake()或Start()函数中的值。

void Start()
{
    positionPoint = GameObject.Find("Spawner").GetComponent<deployCapsule>().positionPoint;
}
oogrdqng

oogrdqng2#

在示例化胶囊预制件并为其分配一个名为a的引用之后(我建议您将此命名更改为更符合逻辑的名称)

GameObject a = Instantiate(CapsulePrefab);

假设您的prefab已经连接了PathFollower组件,您可以使用GameObject.GetComponent<T>方法来访问它。

var pathFollowerComponent = a.GetComponent<PathFollower>();

之后,您可以使用对位于层次和场景中的“点”游戏对象的引用填充positionPoint[]变换的数组(假设这就是您要找的)。
这取决于你如何去做:

  • 您可以在每个点上创建一个tag,使用GameObject.FindGameObjectsWithTag("Point");
  • 从“PathFollower”GameObject获取子对象,并将其子变换添加到数组中
  • 创建一个单一示例或“GameManager”类,用于存储场景中的点
  • 如果动态创建新点,请创建侦听器并调用事件,以便在示例化新点时将其添加到数组中。

请注意,上面提到的可能不会返回的顺序,你把他们的点,所以你可能需要排序!一般来说,有很多其他的方法,你可以找到搜索论坛,或在谷歌!

t3psigkw

t3psigkw3#

这里的问题是你的预制件在项目中,而路径节点在场景中。你有两种方法来解决这个问题。
首先,路径节点位于父对象下,该父对象包含一个容器脚本:

public class PathNodes : MonoBehaviour
{
     [SerializeField] private Transform m_nodes;
     public Transform [] Nodes => m_nodes;
}

您可以使用单例模式(是的,如果使用得当,就可以了),或者让新创建的对象使用FindObjectOfType,然后就可以访问节点了。
第二种解决方案是将你的对象的预制件作为一个非活动对象在场景中创建。在场景中,你可以将你需要的所有东西从场景拖放到场景中。预制件被拖到原始项目预制件(CapsulePrefab)的位置,当创建它的克隆时,你只需要将它设置为活动。

相关问题