【问题标题】:Why aren't the vectors carrying over into an other function?为什么向量不能延续到其他函数中?
【发布时间】:2018-11-26 10:13:19
【问题描述】:

当我将向量分配给数组时,不会将其传递给 RocketUpdate 函数。正在使用的基因阵列来自在火箭阵列的游戏对象上运行的其他脚本。这是它的脚本。

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]);
        }
    }
}

当我在启动函数中运行第一个 Debug.log() 时,每个游戏对象都有它的值。但是当我在 RocketUpdate() 中运行相同的 Debug.log 时,它突然不再具有它的值。很长一段时间以来,我一直被同一个问题困扰。如果有人知道问题,请告诉。

【问题讨论】:

  • 附注:一般情况下尽量避免一遍又一遍地调用GetComponent。而是在第一次获得参考后存储并重复使用它。你可以例如已经制作了Rockets[] 类型的rockets,或者为什么不使用List&lt;Rocket&gt;()?列表的巨大优势在于您可以随时扩展它们。
  • 请您进一步解释一下您的整个代码应该做什么......我仍在试图弄清楚这里应该发生的一切
  • 我打算创建一个人工智能。但首先我需要创建一个脚本,它只运行一个向量数组并将刚体设置为这些向量

标签: c# arrays unity3d vector


【解决方案1】:

几件事。在您的第一个脚本中,您不是用一堆值填充数组,而是创建一个新数组,其中包含 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 调用会大大增加您的开销。

另外,我很感兴趣。你对这个脚本的目标是什么?你的游戏是关于什么的?

【讨论】:

  • 我打算创建一个人工智能。但我遇到了很多障碍,所以它运行得不是很顺利。在您的代码第一行中,我的 c# 脚本无法识别 MainScript 类型。我必须生成一个新类型吗?或者我可以使用类型 Component
  • In your first script you aren't populating an array with a bunch of values, you are creating a new array with space for 10 Vector2s. .. 据我所知,数组中充满了rocketObject.GetComponent&lt;Rockets&gt;().Gene[j] = new Vector2(x, y);。我在问题中也没有看到MainScriptYou should also initialize a List and populate it with those rockets .. 这不是 public GameObject[] rockets; 的用途吗?
  • 他有一个小sn-p,它来自顶部的辅助脚本,称为rockets,下面有一个更大的主脚本,称为rocketController。在第一个脚本中,只有一个数组的创建,没有别的。虽然你对火箭阵列是正确的,但他仍然应该为每个火箭的刚体使用另一个阵列,以避免每秒调用 getcomponent @derHugo
  • 是的,你需要重命名所有这些东西以匹配你的变量名,在我说 MainScript 的地方,你需要准确地将它命名为你的类的名称,否则它将无法找到它。
  • 而且不是每一秒,而是每一帧;)
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多