Можно ли включить переменную внутри вектора3? - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь сделать игру вроде склона, где каждые 3 секунды появляются новые препятствия.Вместо создания бесконечных точек появления я подумал о создании первой и изменил z на 20 пикселей.проблема в том, что я не знаю, как сделать Vector3, хранящий 2 целых числа и переменную.

Я немного застрял, поэтому ничего не пробовал, так как не знаю, что попробовать.

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;

    }
}

Я хочу сохранить переменную count в порождении Vector3.

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Вы не можете хранить что-либо еще в Vector3 или любых других встроенных переменных *.Вы можете, и вы должны создать пользовательские контейнеры для ваших переменных, таких как классы или структуры

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

или что-то вроде

public struct Custom
{
    Vector3 vec;
    int count;
}
1 голос
/ 25 сентября 2019

Конечно, вы можете .. но он больше не будет называться 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 новый объект каждый кадр вообще очень плохая идея.Если вам действительно нужно так много объектов оформить заказ Объединение объектов

1 голос
/ 25 сентября 2019

Каждый раз, когда вы хотите изменить ось 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;
        }
    }
}
...