在 Unity 3d 中移动 3d 模型
Move 3d models in Unity 3d
在 unity 3d 中,我创建了一个空游戏对象,当我用鼠标单击时它会实例化一个简单的 3d 模型(从 blender 导入的 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;
}
}
一般来说,您需要做的就是始终将新对象生成为此 EmptyGameObject
的 子项 。 Instantiate
因此有一个重载,需要一个额外的父 Transform
引用来生成预制件作为子项。
据我了解,第二个脚本也附加到 EmptyGameObject
,因此您的目标父级只是 transform
(GameObject
此脚本的 Transform
组件是附于):
//spawn model as child of given Transform
model = Instantiate(prefab, transform.position, Quaternion.identity, transform);
另请注意,转换为 (GameObject)
是多余的,因为 Instantiate
无论如何 returns 给定预制件的类型。
然而
我不太明白你在这里使用 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;
在 unity 3d 中,我创建了一个空游戏对象,当我用鼠标单击时它会实例化一个简单的 3d 模型(从 blender 导入的 3d 模型)。
我编写了一个简单的脚本,使用
移动 EmptyGameObjecttransform.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;
}
}
一般来说,您需要做的就是始终将新对象生成为此 EmptyGameObject
的 子项 。 Instantiate
因此有一个重载,需要一个额外的父 Transform
引用来生成预制件作为子项。
据我了解,第二个脚本也附加到 EmptyGameObject
,因此您的目标父级只是 transform
(GameObject
此脚本的 Transform
组件是附于):
//spawn model as child of given Transform
model = Instantiate(prefab, transform.position, Quaternion.identity, transform);
另请注意,转换为 (GameObject)
是多余的,因为 Instantiate
无论如何 returns 给定预制件的类型。
然而
我不太明白你在这里使用 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;