动态地将3d对象添加到Unity3d中的场景

时间:2013-03-11 14:15:36

标签: unity3d unityscript

我正在开发一个Unity3d项目,在这个项目中,我想在一个keyPress上以相同的位置,方向动态地将3d对象添加到场景中。为了这样做,我导入了这些对象并为所有这些做了一个预制件。我使用以下脚本来执行此操作.bt它没有做必要的..新对象被实例化并被添加到场景中但是旧物体不会被毁坏。而且,新物体的位置并不总是相同的。场景最初由立方体组成。按“1”,“2”等后,我想要一个新的对象来替换正在显示的1(在同一位置)。

脚本:

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;
     }
    }
}

1 个答案:

答案 0 :(得分:4)

有几件事需要考虑:

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

    1. 像4中一样优化原始模型。
    2. 引入一个成员变量来存储对当前对象的引用 更新:如果您想在启动时初始化一个特殊对象(例如Cube),首先将其拖到场景中,然后将新创建的Cube从层次结构视图拖到可变的current。所以你在启动场景时首先看到立方体,而你的脚本知道,当它必须替换它时,这是最新的。
    3. 创建对象实例化方法
    4. 我在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);