Переместить 3d модели в Unity 3d - PullRequest
0 голосов
/ 25 февраля 2020

В Unity 3D я создал пустой GameObject, который запускает простую 3d-модель, когда я щелкаю мышью (3d-модель, импортированная из blender).

Я написал простой скрипт, который перемещает объект EmptyGameObject с использованием

transform.Translate(speed * Time.deltaTime, 0, 0);

Но когда я запускаю проект, движется только Пустой игровой объект, но мне нужно, чтобы 3d-модель переместилась в х ASIX. Как я могу решить эту проблему? Спасибо за помощь.

Скрипт перемещения (надевает EmptyGameObject):

public float speed = 0f;

    // Start is called before the first frame update
    void Start()
    {
        speed = 0f;
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(speed * Time.deltaTime, 0, 0);
        if (Input.GetMouseButtonDown(0)) {
            speed += speed + 0.5f;

        }
    }

Скрипт для создаваемых объектов:

   public GameObject model;
   public GameObject model1;


public int counter = 0;

    void Start(){
     model=  Instantiate(model, transform.position, Quaternion.identity); //spawn model
    }

    void Update(){
    if (Input.GetMouseButtonDown(0)) {
        ChangeModel();
    }
    }


    void ChangeModel(){
    counter++;
            switch (counter) {

                case 1:
                    Destroy(model);
                    Destroy(model1);
                    model = (GameObject) Instantiate(model, transform.position, Quaternion.identity);
                    break;

                case 2:
                    Destroy(model);
                    model1= (GameObject) Instantiate(model1, transform.position, Quaternion.identity);
                    counter =0;
                    break;


            }
    }

1 Ответ

0 голосов
/ 26 февраля 2020

В общем, все, что вам нужно сделать, это порождать новые объекты всегда как children из этого EmptyGameObject. Instantiate поэтому имеет перегрузку, принимая дополнительный родительский элемент Transform для порождения префаба как потомка.

Как я понимаю, второй скрипт также прикреплен к EmptyGameObject, поэтому ваш целевой родитель просто transform (Transform компонент GameObject, к которому присоединен этот скрипт):

//spawn model as child of given Transform
model = Instantiate(prefab, transform.position, Quaternion.identity, transform); 

Также обратите внимание, что приведение к (GameObject) является избыточным, поскольку Instantiate в любом случае возвращает тип данного префаба.


Однако

Я не совсем понимаю, как вы здесь используете model, model1 и Instantiate и Destroy. ..

Зачем вам уничтожать model, если вы все равно хотите напрямую его возродить?

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

public GameObject prefab;
public GameObject prefab1;

void Start()
{
    model =  Instantiate(prefab, transform.position, Quaternion.identity, transform);
    model1 = Instantiate(prefab1, transform.position, Quaternion.identity, transform);

    model1.SetActive(false);
}

void ChangeModel()
{
    counter = (counter + 1) % 2;

    model.SetActive(counter == 0);
    model1.SetActive(counter == 1);
}

Вот и все. Если вы просто уже поместили два префаба в EmptyGameObject с самого начала, вам вообще не нужен Instantiate ...

И, кстати, если у вас все равно есть только два состояния вместо счетчик, вы также можете использовать простой bool здесь:

bool isModel1;

private void ChangeModel()
{
    isModel1 = !isModel1;

    model.SetActive(!isModel1);
    model1.SetActive(isModel1);
}

И, наконец, обратите внимание, что из вашего скрипта движения:

speed += speed + 0.5f;

это приводит к

speed = speed + speed + 0.5f;

но я думаю, что вы скорее всего хотите

speed += 0.5f;

, что приводит к

speed = speed + 0.5f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...