Unityで3Dオブジェクトの使い方です。
3Dオブジェクトのインサート
シンプルな物体
球や平面などのシンプルな物体、地形などはメニューの
インポート
3Dソフトのデータをもってくることもできます。
Blenderで作りFBXファイルで出力。
アセットに登録して、シーンへドラッグすれば設置完了です。
対応しているファイルフォーマットは
- dae(Collada)
- .3ds
- .dxf
- .obj
です。
3Dオブジェクトの使い方
スクリプトで生成する
物体を一度プレハブ化します。プレハブ化された物体は、スクリプトから複製できるようになります。
まずヒエラルキーで、大きさやマテリアルなどを付けた物体をアセットへドラッグしてプレハブ化しておきます。
生成スクリプトでは、まずプレハブしたオブジェクトを宣言。
[SerializeField] GameObject Cube;
スクリプトでシリアライズド宣言するとそこへオブジェクトをアタッチできるので、プレハブをドロップしておきます。
あとは「Instantiate」関数で生成します。
ゲームオブジェクトは基本的に位置情報を持っているため、生成時に位置や回転を指定することができます。
GameObject g = Instantiate(Cube, new Vector3(myx, myy, 10.0f), Quaternion.identity);
削除するには「Destroy」を使います。
GameObject CUBE;
CUBE= GameObject.Find("BIG CUBE");
Destroy(CUBE);
スクリプトで移動や回転させる
「transform」を使います。
this.gameObject.transform.Translate(1,1,1);
回転は「Rotate」
this.gameObject.transform.Rotate(1,1,1);
処理の遅さを吸収するため「Time.deltaTime」を使うといいです。
「 5f * Time.deltaTime」とすると1秒で5メートル進むといった具合。
スクリプトで表示・非表示にする
表示・非表示はアルファ値を変化させるか、「SetActive」で指定。
this.gameObject.SetActive (false);
完全に削除するには「Destory」を使います。
この場合ヒエラルキーからもなくなります。自動生成した銃弾などが画面外になったら消去という場合に使います。
Destroy(this.gameObject);
スクリプトでアニメーションを再生する
アニメーションがセットされていれば、Playで実行可能。
Animation animSet= this.gameObject.GetComponent<Animation> ();
animSet.Play ();
特定のアニメーションセットはその名前を引数に。
animSet.Play ("animation-waling");
Pivotを変更する
Pivotとは物体の重心のようなもので、回転させる場合の支点となる場所です。
位置変更を簡単にするアセットを使うと調整しやすいです。
以下よりアセットを入手。
Adjust Pivot | Utilities Tools | Unity Asset Store
3DのオブジェクトAを配置。
空のオブジェクトを追加し、オブジェクトAの子供にします。そして、空のオブジェクトはオブジェクトAのピボットにしたい位置へ移動しておきます。
アセットを追加後、「ウィンドウ>Adjust Pivot」を実行。
「Adjust Pivot」を実行すればOK。
Pivotが変更されていることが確認できれば、空のオブジェクトは削除しても大丈夫です。
物理属性を追加する
物理属性を付与すると、重力で落下させたりできます。
簡単に実装するには、3Dオブジェクトを選択した状態で、インスペクタのコンポーネントで「RigidBody」を追加。
これで実行するだけで3Dオブジェクトは重力で落下していきます。
Rigidbodyの設定は、
- 質量、
- 抗力(空気抵抗)、
- 回転抗力(回転時の空気抵抗)、
- Is Kinematic(物理演算を無効)、
- 補間、
- 衝突判定
...など。
重力を利かせない場合は「重力を使用」をオフります。
スクリプトから力を加えるには「AddForce」関数を利用します。
引数の「ForceMode.Force」「Forcemode.VelocityChange」で挙動に差があります。
if (Input.GetKeyDown(KeyCode.LeftArrow)) {
Debug.Log("LEFTKEY");
GetComponent<Rigidbody>().AddForce(Vector3.left * 100, ForceMode.Force);
}
衝突を判定する
衝突開始時には「OnCollisionEnter」、衝突の間中は「OnCollisionStay」衝突後離れた場合は「OnCollisionExit」の関数がコールされます。
ぶつかった相手はcollision引数から取得できます。
private void OnCollisionEnter(Collision collision)
{
Destroy(collision.gameObject);
}
特定の物体かどうか判定させることも可能。
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.name=="Plane"){
Destroy(collision.gameObject);
}
}
本ブログのUnity関連記事一覧はこちら。