2013-03-11 114 views
3

我正在Unity3d项目中处理一个Unity3d项目,在该项目中,我想通过keyPress动态地将三维对象添加到场景中,位置相同,方向一致。为此,我导入了这些对象,并为所有这些做了预制。我使用下面的脚本来做到这一点.. bt它不需要做必要的事情。新对象被实例化并被添加到场景中但旧物不会被破坏。而且,新对象的位置并不总是相同的。场景最初由一个Cube组成。当我按'1','2'等。我想要一个新的对象来替换正在显示的1(在相同的位置)。向Unity3d中的场景动态添加3D对象

脚本:

var myCar : GameObject; 
var Cube : GameObject; 
var Globe: GameObject; 
var Clock : GameObject; 
var Pistol : GameObject; 
var LCD : GameObject; 
var prev : int; 
var temp: GameObject; 
function Start() 
{ 
    prev =0; 
    temp=null; 

} 

function Update() 
{ 
    if(prev==0) 
     temp=Cube; 
    else if(prev==1) 
     temp=myCar; 
    else if(prev==2) 
     temp=Globe; 
    else if(prev==3) 
     temp=Pistol; 
    else if(prev==4) 
     temp=Clock; 
    else if(prev==5) 
     temp=LCD;  

    if(Input.GetKey(KeyCode.Alpha1 || KeyCode.Keypad1)) 
    { 
     if(prev!=1) 
     { 
      Instantiate(myCar,temp.transform.position ,temp.transform.rotation); 
      myCar.transform.localScale = Vector3(0.06,0.06,0.06); 
      Destroy(temp); 
      prev=1; 
     }  
    } 
    else if(Input.GetKey(KeyCode.Alpha2 || KeyCode.Keypad2)) 
    { 
    if(prev!=2) 
    { 
     Instantiate(Globe,temp.transform.position ,temp.transform.rotation); 
     Globe.transform.localScale = Vector3(0.04,0.04,0.04); 
     Destroy(temp); 
     prev=2; 
    } 

    } 
    else if(Input.GetKey(KeyCode.Alpha3 || KeyCode.Keypad3)) 
    { 
    if(prev!=3) 
    { 
     Instantiate(Pistol,temp.transform.position ,temp.transform.rotation); 
     Pistol.transform.localScale = Vector3(0.03,0.03,0.03); 
     Destroy(temp); 
     prev =3; 
    } 
    } 
    else if(Input.GetKey(KeyCode.Alpha4 || KeyCode.Keypad4)) 
    { 
    if(prev!=4) 
    { 
      Instantiate(Clock,temp.transform.position ,temp.transform.rotation); 
      Clock.transform.localScale = Vector3(0.08,0.08,0.08); 
      Destroy(temp); 
      prev=4; 
    } 

    } 
    else if(Input.GetKey(KeyCode.Alpha5 || KeyCode.Keypad5)) 
    { 
    if(prev!=5) 
    { 
     Instantiate(LCD,temp.transform.position ,temp.transform.rotation); 
     LCD.transform.localScale = Vector3(0.04,0.04,0.04); 
     Destroy(temp); 
     prev=5; 
    } 
    } 
} 

回答

4

有几件事情要考虑:

  1. 这将是更好地存储到的if-else-if部分的当前活动的对象这一翻译的参考。
  2. Destroy在预制对象上调用,但不在现有的GameObject实例上调用,因此不执行任何操作。
  3. 对于transform的所有操作都是相同的。它们只影响预制件。
  4. 不是一个真正的错误,而是一个真正的增强:在我们的3D软件中扩展您的模型,以便它们可以在没有localScale调整的情况下实例化。
    更新:如果您无法访问Blender,Maya等3D软件的原始模型,您可以轻松地在预制中定义合适的比例尺。关键是要尽量减少代码中的重复内容,并将所有类型的属性设置放入预制。

干脆把这个,我的建议:

  1. 细分原机型一样在4
  2. 介绍一个成员变量来存储当前对象的引用。
    UPDATE:如果你想例如Cube初始化在启动一个特殊的对象,首先将其拖动到场景中,然后将新的层次结构视图中创建Cube到varable current。所以,你首先看到魔方开始现场,你的脚本知道这是当前时,它有可能取代它的时候。
  3. 创建对象实例的方法

我工作在C#,但它应该是这样的

var current : GameObject; 

...

function ReplaceObject (prefab : GameObject, newKey : int) { 
    if (newKey != prev) { 
     GameObject newObject = Instantiate(prefab, current.transform.position, 
      current.transform.rotation); 
     Destroy(current); 
     current = newObject; 
     prev = newKey; 
    } 
} 

...

function Update() 
{ 
    if(Input.GetKey(KeyCode.Alpha1 || KeyCode.Keypad1)) { 
     ReplaceObject (myCar, 1); 
    } else if(Input.GetKey(KeyCode.Alpha2 || KeyCode.Keypad2)) 
     ReplaceObject (Globe, 2); 
+0

感谢您的回报年。我真的很新的统一..我有点明白你解释什么。但如何调整对象,让他们(当我不将它们添加到现场)?我应该把它们放在预制件中吗?而且,当前的变量应首先指向立方(场景已加入)..对不对? – Heramb 2013-03-11 15:07:43

+0

@Heramb查看我的更新回答 – Kay 2013-03-11 15:46:35

+1

非常感谢..为解释和代码..它工作只是我想要的方式.. :) – Heramb 2013-03-11 17:55:00