3

キーを押すと、3d オブジェクトを同じ位置、向きでシーンに動的に追加したい Unity3d プロジェクトに取り組んでいます。そうするために、これらのオブジェクトをインポートし、これらすべてのプレハブを作成しました..次のスクリプトを使用してそうしています..しかし、それは必要なことをしません..新しいオブジェクトがインスタンス化され、シーンに追加されますただし、古いオブジェクトは破棄されません。また、新しいオブジェクトの位置は常に同じではありません。シーンは、最初は Cube で構成されています。「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;
     }
    }
}
4

1 に答える 1

4

考慮すべき点がいくつかあります。

  1. if-else-if 部分ではなく、現在アクティブなオブジェクトへの参照を保存する方がよいでしょう。
  2. Destroyプレハブ オブジェクトで呼び出されますが、既存のGameObjectインスタンスでは呼び出されないため、何もしません。
  3. のすべての操作で同じですtransform。プレハブのみに影響します。
  4. バグではありませんが、機能強化です。3D ソフトウェアでモデルをスケーリングして、localScale調整せずにインスタンス化できるようにします。
    更新: Blender、Maya などの 3D ソフトウェアの元のモデルにアクセスできない場合は、プレハブで適切なスケールを簡単に定義できます。キーポイントは、コード内での繰り返しを最小限に抑え、あらゆる種類のプロパティ設定をプレハブに入れることです。

これをまとめて、私の提案:

  1. 4 のように元のモデルを改良します。
  2. 現在のオブジェクトへの参照を格納するメンバー変数を導入します。
    更新:たとえばCube、開始時に初期化される特別なオブジェクトが必要な場合は、最初にそれをシーンにドラッグし、次に新しく作成Cubeしたものを階層ビューから変数にドラッグし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);
于 2013-03-11T14:43:02.517 に答える