UnityとBlenderでAR家具配置検討アプリを作ってみる#6~キーボードでモデルを動かしてみる~
前回でBlenderで作成したモデルをUnityに取り込みましたね。
ちなみに前回↓
さぁ、次は3Dモデルに”スクリプト”を追加して、機能を着けていきましょう。
今回追加する機能は、キーボードでの移動・回転の位置や姿勢の制御機能です。
モデルに機能をつける
それではモデルに機能を追加してみましょう。
機能はプログラム言語のC#で”スクリプト”に記述し、モデルに反映することで追加できます。
とりあえずやってみましょう。
空のスクリプトを追加する
スクリプトを新規追加するので、プロジェクトビューで右クリックをして、
Create → C# Script を選択します。
名前は適当でいいですが、私はMoveModelにしました。
これでスクリプトの新規作成はおしまいです。
次に、中身をC#で書いていきましょう。
スクリプトを開く
では、先ほど作成したスクリプトをダブルクリックして開きます。
Visual Studioが立ち上がるので、少々待ちます。
立ち上がると、以下のような画面になっていると思います。
中身を本当に軽く説明すると、
using System.Collections
using System.Collections.Generic
これはC#の基本機能を使うための宣言です。
using UnityEngine
これはUnityで用意されている関数を使うための宣言です。
public class hogehoge : MonoBehaviour
これはクラスの宣言と継承ってやつです。C#の勉強をするときにまた詳しくやりましょう。
今回は最初にこれを書くんだって思っておいてください。
とりあえず、MonoBehaviourを継承するとUnityの機能を使えると思っておいてください
void Start() { }
これはスクリプトのプログラムが開始されたら働く部分です。
void Update() { }
これはframeといってゲーム内で画面更新があるたびに働く部分です。
さて、この基本部分に追記していく形で機能を記述していきましょう。
スクリプトにモデルを動かすための機能を記述する
今回はモデルを動かすために、Transformというクラスを使用します。
リファレンスを一応貼っておきます。
では、変数の値を変えて動かすことと、用意されている関数を使って動かことをしてみましょう。
ちなみに記述したものは以下になります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveModel : MonoBehaviour
{
float speed; // 移動調整量を毎度書くのが面倒くさいのでここで変数の定義をしておく
void Start()
{
speed = 0.01f; // 移動量の調整
}
void Update()
{
if (Input.GetKey("up"))
{
this.gameObject.transform.position += this.gameObject.transform.forward * speed;
}
else if (Input.GetKey("down"))
{
transform.position -= transform.forward * speed;
}
else if (Input.GetKey("right"))
{
transform.Translate(1.0f * speed, 0, 0);
}
else if (Input.GetKey("left"))
{
transform.Translate(-1.0f * speed, 0, 0);
}
else
{
// 何もしない
}
if (Input.GetKey("d"))
{
transform.Rotate(0, 5.0f, 0);
}
else if (Input.GetKey("a"))
{
transform.Rotate(0, -5.0f, 0);
}
else
{
// 何もしない
}
}
}
position変数で動かす
Transformクラスを使用するためには、
this.gameObject.transform.hogehogeと記述します。
this.gameObjectは、このスクリプトを適用しているモデルを指しています。
その後ろに、.transformと書いてTransformのコンポーネントを取得し、
その後ろに関数や変数を書くことでTransformクラスが使用できます。
なので、書き方としては
this.gameObject.transform.position += this.gameObject.transform.forward * speed
となります。
position変数をforward変数を使って変化させています。
モデルの前向きのベクトルを使った移動方法ですね。
Translate関数で動かす
変数ではなく関数も使ってみましょう。
Translate(x, y, z)で、移動方向と移動量を指定できます。単位はメートルです。
書き方としては、例えばx方向への移動であれば、
this.gameObject.transform.Translate(1, 0, 0)
となります。移
Rotate関数で回転させる
移動以外の関数も使ってみましょう。
Rotate(xAngle, yAngle, zAngle)で、回転方向と回転量を指定できます。単位は度です。
書き方としては、y軸中心で回転させるのであれば、
this.gameObject.transform.Rotate(0, 1, 0)
となります。
キーボードの入力を受け付ける
キーボードの入力を受けてみましょう。
Input.GetKey("hogehoge")で、キーボード操作を受けられます。
if文で条件分岐をさせる
たくさんのキーボード操作をしたい場合は、
〇〇キーが押されたら□□させるという処理をさせられればうれしいですよね。
そのためにif文というものを使います。書き方は、
if(条件1) { させたい処理1 }
else if(条件2) { させたい処理2 }
else { させたい処理3 }
と書きます。
日本語で書くと、
もし、条件1が成立しているならば、させたい処理1を実行
条件1が成立していなくて、条件2が成立しているならば、させたい処理2を実行
条件1も条件2も成立していないならば、させたい処理3を実行
こんな感じです。
これでキーボード操作による位置と回転制御部分は記述できましたね。
保存するのを忘れないようにしてくださいね。
次はスクリプトをモデルに適用していきましょう。
スクリプトをモデルに適用する
さぁ、あとはモデルにスクリプトを適用するだけです。
方法は簡単で、今作成したスクリプトのファイルをヒエラルキービューにある適用したいモデルにドラッグ&ドロップするだけです。
ドラッグ&ドロップしたのちに、左のインスペクタにスクリプトが表示されていることを確認してください。
これで適用完了です!
さぁ動かしてみましょう!
実行してキーボードで動かしてみる
では再生ボタンを押してゲームを実行してみましょう。
動きましたか?
私は動かなかったです。
正確に言うと、動いているけど動いてないように見えるです(笑)
原因は、カメラも一緒に動いているから。
Blenderからモデルを持ってくるときに、カメラも一緒に持ってきているパターンですね。
モデル側のカメラを消しましょう。
取り込んだBlenderモデルからカメラを削除する
削除しましょう。
削除の方法は、ヒエラルキービューにある取り込んだモデルのプレハブ上で右クリックし、Unpack Prefabを行い、消したいものをDeleteするです。
さて、これで動くようになったはずです。
最後に
これでUnityでモデルに機能を持たせる方法ができるようになりましたね。
スクリプトはC#で書くことになるので、もし興味がある人はC#を勉強してみてもよいのではないでしょうか。
このブログでは『必要な時に、必要なものだけ』をモットーに進めているので、C#をがっつりやることはないかもしれませんが、ちょこちょこ知識はたまっていくはずなので気長によろしくお願いします(笑)
さて、次回はAR表示の準備です。頑張っていきましょう!
ではではー!