向量为什么不带入其他功能?

时间:2018-11-26 10:13:20

标签: c# arrays unity3d vector

当我将向量分配给数组时,不会将其转移到rocketUpdate函数。正在使用的“基因”数组来自火箭数组中运行在gameObjects上的其他脚本。这是它的脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rockets : MonoBehaviour {

    public Vector2[] Gene;

    public void Start()
    {
        Gene = new Vector2[10];
    }
}

这是主要的“控制器”脚本。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketController : MonoBehaviour {

    public int XVelocityMultiplier;
    public int YVelocityMultiplier;

    int lifespanSec;

    int Count;

    public int Size;
    public GameObject[] rockets;
    public GameObject RocketPrefab;

    public System.Random rnd = new System.Random();
    float x;
    float y;

    void Start()
    {
        rockets = new GameObject[Size];

        lifespanSec = RocketPrefab.GetComponent<Rockets>().Gene.Length;

        Invoke("killRockets", lifespanSec);

        for (int i = 0; i < rockets.Length; i++)
        {
            GameObject rocketObject = Instantiate(RocketPrefab);
            rocketObject.GetComponent<Rigidbody>().position = new Vector3(0, -4, 30);
            rocketObject.name = "Rocket_" + (i+1);

            for (int j = 0; j < rocketObject.GetComponent<Rockets>().Gene.Length; j++)
            {
                x = Convert.ToSingle(rnd.NextDouble() * (2 * XVelocityMultiplier) + XVelocityMultiplier * (rnd.Next(-1,1) + 0.1f));
                y = Convert.ToSingle(rnd.NextDouble() * (YVelocityMultiplier));
                rocketObject.GetComponent<Rockets>().Gene[j] = new Vector2(x, y);
                Debug.Log(rocketObject.GetComponent<Rockets>().Gene[j]);
            }
            rockets[i] = rocketObject;

        }
        InvokeRepeating("RocketUpdate", 0, 1);
    }

    void Update()
    {
        if (Count == lifespanSec)
        {
            Count = 0;
        }
    }

    void RocketUpdate()
    {
        Debug.Log(rockets[1].GetComponent<Rockets>().Gene[Count]);
        if (rockets[0] != null)
        {
            for (int i = 0; i < rockets.Length; i++)
            {
                rockets[i].GetComponent<Rigidbody>().velocity = rockets[i].GetComponent<Rockets>().Gene[Count];
            }
            Debug.Log(rockets[1].GetComponent<Rockets>().Gene[Count]);
        }
        Debug.Log(Count);
        Count++;
    }

    void killRockets()
    {
        for(int i = 0; i < rockets.Length; i++)
        {
            Destroy(rockets[i]);
        }
    }
}

当我在start函数中运行第一个Debug.log()时,每个gameObject都有其值。但是当我在rocketUpdate()中运行相同的Debug.log时,它突然不再具有其值。我在同一个问题上困扰了很长时间。如果有人知道问题,请告诉。

1 个答案:

答案 0 :(得分:0)

几件事。在第一个脚本中,您没有使用一堆值填充数组,而是创建了一个新的数组,该数组的空间可以容纳10个Vector2。我不确定这是否是您想要的,但事实就是如此。为了用数据填充数据,您必须通过创建对包含实际值的脚本的引用来明确告知数据内容。例如,

private MainScript whateverYouWannaCallIt;
private Vector2[] geneCopies; 

public void Awake()
{
    whateverYouWannaCallIt = gameObject.GetComponent<MainScript>();

    for (int i = 0; i < whateverYouWannaCallIt.rockets.Length; i++)
    {
        geneCopies[i] = whateverYouWannaCallIt.rockets.gene[i];
    }
}

您还应该初始化一个List,并用这些火箭填充它,也许还包括那些刚性物体,这些getComponent调用将为您的开销做出很大贡献。

我也很感兴趣。该脚本的目标是什么?那你的游戏是什么?