在vector3内是否可以包含变量?

时间:2019-09-25 14:43:00

标签: c# unity3d vector levels

我试图制作一种类似斜坡的游戏,每3秒就有新的障碍物出现。 我没有制作无限的生成点,而是想到制作第一个,并将z更改20个像素。问题是我不知道如何制作一个可以存储2个整数和一个变量的Vector3。

我有点卡住了,因为我不知道该怎么做,所以我没有尝试过任何东西。

using System.Collections.Generic;
using UnityEngine;

public class levelgen : MonoBehaviour

{
    private int count = 9;
    public GameObject[] templates;


    // Update is called once per frame
    void Update()
    {
        public Vector3 spawn = new Vector3(-2, 0, count);
        int rand = Random.RandomRange(1, 5); //1-5 types of levels
        Instantiate(templates[rand], spawn1, Quaternion.identity);
        count = count + 20;

    }
}

我想将变量计数存储在Vector3生成物中。

3 个答案:

答案 0 :(得分:2)

您不能将其他任何内容存储到Vector3或任何其他内置变量中*。可以,并且应该为变量(如类或结构)创建自定义容器

public struct Custom
{
    int a;
    int b;
    string name;
    int count;
}

或类似

public struct Custom
{
    Vector3 vec;
    int count;
}

答案 1 :(得分:1)

每次您要更改新生成的z轴时,都需要将其重新分配给Vector3变量。您可以在for循环中执行此操作,如下所示。

在这种情况下,

zPosition将存储最新的zPosition值,因此您无需将其存储在其他任何地方。如果您想在前10个之后生成更多障碍物,那么它将从停止的zPosition处拾取。

public class levelgen : MonoBehaviour
{
    public GameObject[] templates;
    public Vector3 spawn;
    int zPosition = 0;

    void Start()
    {
        GenerateObstacles(10);
    }

    void GenerateObstacles (int numObstacles)
    {
        for (int i = 0; i < numObstacles; i++)
        {
            spawn = new Vector3(-2, 0, zPosition);
            int rand = Random.Range(0, 6); //1-5 types of levels
            Instantiate(templates[rand], spawn, Quaternion.identity);
            zPosition += 20;
        }
    }
}

答案 2 :(得分:1)

确定您可以 ..,但它将不再被称为count,例如z

public class levelgen : MonoBehaviour
{
    // You can not declare a public field within a method
    // so move it to class scope
    public Vector3 spawn = new Vector3(-2, 0, 9);
    public GameObject[] templates;

    // Update is called once per frame
    void Update()
    {
        // Here NOTE that for int parameters the second argument is "exclusiv"
        // so if you want correct indices you should always rather use
        int rand = Random.RandomRange(0, templates.Length);
        // I will just assume a typo and use spawn instead of spawn1
        Instantiate(templates[rand], spawn, Quaternion.identity);

        spawn.z += 20;

        // Or I would prefer since this works in general
        // Vector3.forward is a shorthand for writing new Vector3(0, 0, 1)
        // and this works in general
        spawn += Vector3.forward * 20;

        // you can e.g. NOT use
        //transform.position.z += 20
        // but only
        //transform.position += Vector3.forward * 20;
    }
}

注意通常,让代码Instantiate一个新对象每帧是一个非常糟糕的主意。如果您确实需要这么多对象,请检出Object Pooling