【问题标题】:Move 3d models in Unity 3d在 Unity 3d 中移动 3d 模型
【发布时间】:2020-02-25 14:27:53
【问题描述】:

在 unity 3d 中,我创建了一个 Empty GameObject,当我用鼠标单击时会实例化一个简单的 3d 模型(从搅拌机导入的 3d 模型)。

我编写了一个简单的脚本,可以使用来移动 EmptyGameObject

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

但是当我运行项目时,只有空游戏对象在移动,但我需要将 3d 模型移动到 x 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;


            }
    }

【问题讨论】:

  • 如果模型是您的空游戏对象的子对象,它将随之移动
  • @BugFinder 如何通过脚本将模型设置为子模型?
  • 您可以设置父级,也可以将其作为实例化的一部分..
  • 您是想移动子对象还是只是将它们一起移动?
  • @UgurTufekci 是的,我需要将它们一起移动,但现在只有 EmptyGameObject 移动..

标签: c# unity3d public


【解决方案1】:

通常,您需要做的就是始终将新对象生成为EmptyGameObjectInstantiate 因此有一个重载,需要额外的父 Transform 引用来将预制件作为子代生成。

据我了解,第二个脚本也附加到EmptyGameObject,因此您的目标父级只是transform(此脚本附加到GameObjectTransform 组件):

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

还请注意,转换为 (GameObject) 是多余的,因为 Instantiate 无论如何都会返回给定预制件的类型。


然而

我不太明白你在这里对modelmodel1InstantiateDestroy 的用法...

如果你想直接重生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;

【讨论】:

  • 谢谢,你帮了大忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多