MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

開発日誌::HoloLensアプリ開発にチャレンジvol2. UnityEditor上でゾンビをキューブ弾で打って倒れるのを実装するまで。

f:id:k_mawa:20180302170505p:plain

コメント

前回の続きです

k-mawa.hateblo.jp

前回のカーソルを出すところから、大分進みました。ので、記事ボリュームが大きめです・・・

今回から本格的にアプリ開発って感じでした^^ UnityEditor上でゾンビをキューブ弾で打って倒れるのを実装するまでを実装しました。HoloLensアプリ開発は始める前は手が出せるか不安だったのですが、始めてみると、Unityの3Dゲームの制作ノウハウが存分に活かせることを知りました。Unityで普段ゲームを開発している方(そうでなくても今から1つUnityでゲームを作ってみた方)は、HoloLensに関してUnityでの初期設定のことを学べばMRゲームアプリ開発もとっつきやすそうに感じました^^

環境情報

  • Win10Pro
  • Unity 2017.2.1f1
  • HoloToolkit-Unity-2017.2.1.1.unitypackage

大きな流れ

4段階のステップで実現しました。[1][2]は先達の方々の素晴らしい資料のおかげで進められましたので後程ご紹介いたします。

[1]AirTapでキューブが落下するようにする(=>HoloLensで入出力できるようにする)

[2]積み木遊びができるようにする(=>game Objectを意図して適宜出現させる)

[3]キューブ弾を出せるようにする(=>出現させたgame Objectを好きな方向に移動させる)

[4]ゾンビをキューブ弾で撃って倒せるようにする(=>敵オブジェクト+物理エンジンを配置する)

の順で実装を段々複雑にしていきました。

[1]AirTapでキューブが落下するようにする

この資料を元に実装しました。分かりやすいので基本的にこれで進めるのがオススメです。

45分でHoloLensアプリ開発
HoloLensハンズオン(ショー.pptx - Microsoft PowerPoint Online

作ったAirTapでキューブが落下するようにするスクリプトは自分はHoloCameraオブジェクトにコンポーネントとして追加しました。

  • 自分がハマったところ1点目:IInputClickHandlerクラス継承でエラーがでてしまう・・・

自分のくせで一回ハマりかけました。よく使うプログラミング言語Pythonでは>>>import ・・・ とシェルで一行一行確認してデバッグしていたので、

public class AirTapGesture : MonoBehaviour, IInputClickHandler
{ //クラスの中身を書く }

とIInputClickHandlerクラス継承したあとにビルドさせてエラーが延々とでましたが、VSで素直に進めると、自動でコード

//public class AirTapGestureの中身

public void OnInputClicked(InputClickedEventData eventData)
    {
        #したい処理を書く
    }

が自動で実装されるらしいのですが、その流れをどこかで断ち切ってIInputClickHandler継承だけ宣言していたのが原因でした。C#だと、この中に自動で実装されるコードがないかをチュートリアルを見る時にチェックしたほうが良いのだなと思いました。

詳細は上記資料にありますが、HoloLensで空間内でクリックすることをAirTapと言うようで、AirTapしたときにRigidBodyコンポーネントを追加するという意味になります。

    public void OnInputClicked(InputClickedEventData eventData)
    {
        gameObject.AddComponent<Rigidbody>();

    }

ざっくりと(厳密には比べにくいと思いますが)、普段のUnityゲーム開発のマウスクリック↓

Input.GetMouseButtonDown(0)

が、

public void OnInputClicked(InputClickedEventData eventData)

になったような感じでとらえるととっつきやすいと思いました^^

  • 自分がハマったところ2点目:UnityEditorでAirTapがなぜかできない。

これは、下記の記事のようにコード修正すると直りました。めっちゃ助かりました・・・ https://torikasyu.com/?p=1002

うまくAirTapでキューブが落下しています。

[2]積み木遊びができるようにする

次に任意のAirTapでCubeをいっぱいだせるようにすることで、テストから遊び要素が増えてくる感じのチュートリアルにとりくみます。

この記事通りに行いました。この記事でハマりやすい場所は上記の[1]の段階でクリアできているのですが、この段階から進める場合は、[1]のAirTapができない場合のデバッグをこのタイミングですると前にすすめると思います。
qiita.com

[1]で作ったOnInputClickedメソッドをちょっと書き換える感じです。(詳細は記事をご覧いただければ分かるかなと思います^^ )

using HoloToolkit.Unity.InputModule; 
//↑HoloLens入出力がこれでできるようになる
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

 public class AirTapGesture : MonoBehaviour, IInputClickHandler
{ 
    public GameObject original;
    //ここにCube(でもなんでよい出現させたいオブジェクトを入れ込む)

    void Start()
    {
        InputManager.Instance.PushFallbackInputHandler(gameObject);
        //これもオブジェクト初期化にはセットのようです
        //現状とりあえず初期化時に必要なのかなくらいの理解です・・・
    }


public void OnInputClicked(InputClickedEventData eventData)
    {
        //gameObject.AddComponent<Rigidbody>(); 
        //↑[1]で利用した処理

        //↓Cubeオブジェクトを1個作成        
        GameObject cube = GameObject.Instantiate(original);
        //↓自分の視線を起点として前方10.1mの位置を、Unityの空間内の位置座標データに変換して配置
        cube.transform.position = Camera.main.transform.TransformPoint(0, 0, 10.1f);

    }

積み木遊びができました^^

[3]キューブ弾を出せるようにする

出現させたgame Objectを好きな方向に移動させることを実装します。今後にも応用したいところですね。

ここからは通常のUnity3Dゲームの実装と同じでした 。Cubeが出現したらUpdateメソッドでフレームごとに座標移動させます。

手順1:座標移動スクリプトを作る

以下のコードをCubeオブジェクトに配置して、コンポーネントとして付加します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour {

    public float moveSpeed = 0.1f;
    //移動速度

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {

        this.transform.Translate(this.transform.forward * moveSpeed);
        //移動速度の度合いに沿って前進(何かに当たると回転するから前進方向が目まぐるしく変わる)
        
    }
}

できたらAssetにD&Dしてプレファブにしてまとめておきます。

手順2:RigidBodyの重力設定を無効にする

ポイントは、撃ったら落ちてこないようにRigidBodyの重力設定を無効にすることです。

あとは、Haloをつけるとエネルギー弾っぽい演出ができますね^^ f:id:k_mawa:20180302012805j:plain

手順3:AirTap制御のスクリプトに新生Cubeオブジェクトを設置

HoloLensのAirTap制御のスクリプトに作った新たなCubeオブジェクトをD&Dします。

f:id:k_mawa:20180302012919j:plain

実装後。うまくキューブ弾がでています。一定時間後に消えるなどの実装を追加するとよりよい感じですね・・・

[4]ゾンビをキューブ弾で撃って倒せるようにする

敵オブジェクト+物理エンジンを配置する

ゾンビはUnityAssetStoreのフリー素材です。 assetstore.unity.com

ゾンビはダミーの部屋空間に直立できるようにBoxコライダーを大きめに設定しとくと安定しました。なお質量(mass)を弾より小さくしとくといい感じに吹っ飛びます。

f:id:k_mawa:20180302012946j:plain

ゾンビをキューブ弾で打って吹っ飛ばしています。

[5]実機テスト

実機テストはこんな感じです。UI以外はしっかり狙い通りの動きになったかなと思います。(実機テストの仕方はすでにたくさんわかりやすい資料やブログ記事が見つかりましたので割愛させていただきますm( )m )

(UIは、HoloLensに特化した実装が必要なこともわかりました。これは次回以降にチャレンジします。 )

参考文献

45分でHoloLensアプリ開発
HoloLensハンズオン(ショー.pptx - Microsoft PowerPoint Online

qiita.com

unity3d.sakura.ne.jp