開発
Unityでシューティング
Masanori Akiyama
こんにちは、アルバイトの秋山です。
この前はVRのハッカソンに行ってきました!初めて一人で行ったハッカソンであったため最初はすごく緊張したのですが、向こうで組んだチームの方々と様々な話をして打ち解けられてからは楽しく開発ができましたっ!
自分たちチームはお祭りで輪投げをできるコンテンツを作りました。こんな感じのものです↓
3Dモデリングのスキルはないので、鳥居や屋台はUnityのCubeやCylinderを使って作りましたww
このコンテンツはHTC viveを使って遊ぶことができます。HTC viveを個人的にこの前買ったのでまた遊んでみようと思いますw このコンテンツを進化させるのもありですかねっw
それはともかく、HMDを買ったのでこれからはVRの開発を進めていこうと思っています!
「Unityでシューティングっぽいことを再現してみる」
・弾の作成
まず前回Unityの記事で書いた transform.position の位置座標に数値をプラスしていって位置を変えるコードを使って弾をつくってみます。ヒエラルキーを右クリック -> 3D Object -> Sphere で球体を召喚します。Add Component で前回のコードを追加します。これで弾自体は発射できます。あとで色とか軌跡などをつけてみます。
using UnityEngine;
using System.Collections;
public class shotMovement : MonoBehaviour {
public float speed;
void Update () {
this.transform.position += this.transform.forward * speed * Time.deltaTime;
}
}
speedという変数をpublicで宣言しておきUnity側で数値を変えられるようにしています。
コードが書け、ゲームを再生したときに弾が移動がすることを確認でき次第、その弾をプレハブ化します。プレハブとは何回も使用可能なオブジェクトです。プレハブにするにはヒエラルキーにあるオブジェクトをドラッグ&ドロップでProjectのAssetsにいれます。そうすると弾がプレハブになるので、今ヒエラルキーにある弾は必要がなくなります。なのでヒエラルキーにある弾を削除します。
※プレハブにされたオブジェクトは名前が青色に変化します。
・発射口を作る
先ほどと同じ方法でCubeを召喚し、コードを追加します。このコードには先ほど作成した弾を発射するためのコードです。
using UnityEngine;
using System.Collections;
public class Shot : MonoBehaviour {
public GameObject shot;
void Update () {
if (Input.GetKeyUp (KeyCode.Space)) {
Instantiate (shot, this.transform.position, Quaternion.identity);
}
}
}
まず外側でアクセス修飾子がpublicなGameObject型の変数をつくり、その変数に先ほど作成した弾をいれます。入れるのはUnityからの参照です。
Updateの中のif (Input.GetKeyUp (KeyCode.Space))は、
”Spaceキーが入力され、キーを離したら”という意味になります。Inputクラスの中のGetKeyUpは、指定したキーを押してから離した瞬間を指します。キー入力系は他にもGetKeyとGetKeyDownがあります。
そのif文が成立したら、Instantiate (shot, this.transform.position, Quaternion.identity); が実行されます。
Instantiateは指定したオブジェクトを召喚できます。このshotには先ほど作成した弾が入っているため、弾が召喚されます。そして第二引数に召喚したい位置を指してあげます。今回発射口から発射したいので発射位置は自分自信の位置です。よって与える情報は
this.transform.position
となります。
第三引数には召喚したときのそのオブジェクトの向きを指定してあげます。今回はおまじないとして使用します。Quaternionで向きを指定できることだけ知っておいてください。
これらを総合して実行してみると・・・
こーなります↓
これで弾を発射できるようになりました。ですがこれだけだと移動ができません。
・キー入力で移動できるようにする
矢印キーで上下左右に移動できるようにしてみます。
コードはこんな感じになります↓
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
public float speed;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetAxis (“Horizontal“) > 0) {
transform.position += transform.right * speed * Time.deltaTime;
} else if (Input.GetAxis (“Horizontal“) < 0) {
transform.position -= transform.right * speed * Time.deltaTime;
}
if (Input.GetAxis (“Vertical“) > 0) {
transform.position += transform.forward * speed * Time.deltaTime;
} else if (Input.GetAxis (“Vertical“) < 0) {
transform.position -= transform.forward * speed * Time.deltaTime;
}
}
}
まず、先ほどの弾のときと同じで、外側でspeedという弾のスピードをUnity側から調節できるようにする変数を用意します。
次に、Update関数内でキー入力を受け取っています。InputクラスのGetAxisはキーボードやジョイスティックの入力から-1〜1の値をとってきます。上と右キーを入力するとプラスの値、下と左でマイナスをとってこれます。これをif文で分岐してあげ、オブジェクト自体の位置座標に足すか引くをしてあげています。
HorizontalとVerticalは入力軸の名前です。入力軸の設定は Edit -> Project Settings Input から各入力軸の設定を変更できます。今回はデフォルトでやっていっています。
transform.right と transform.forward は方向を示しています。rightはx軸方向、forwardはz軸方向を指します。
これでキー入力で移動ができるようになりました。
ここまでやればシューティングゲームのようなものを再現できます。 私はこれからHTC viveを買ったこともあって本格的に3Dの技術を研ぎたいのでUnityを勉強していきます。VRのコンテンツを個人的に作っていこうと思っていますので、これからも頑張っていきますっ