simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

自由に歩き回る:AIに身体性を与えるためのマイクロワールドの構築8

今回は(も)、ただのゲームの進捗です。
AIは関係なし。

www.youtube.com

今回はユニティちゃんがマイクロワールドを駆けまわるだけの動画です。

f:id:simplestar_tech:20171119182610j:plain

ちょっとブロックのサイズが合わなかったので、いい感じに合わせてみました。

www.youtube.com


以下は、本人用の作業メモ…

今後、ブロックを壊したり、作ったりできるようにするため、プレイヤーが注視しているオブジェクトを特定できるようにします。
まずは、注視している先のブロックをどのようにして特定するかを考える必要がありますが
ユニティちゃんを操作しながら、そのユニティちゃんが見ている先のオブジェクトを特定するのはどうでしょうか?

そのために、六角柱世界にメッシュコライダーを設定しました。

とりあえず、三人称視点で動作するユニティちゃんを配置してみたいのですが、カメラモードが新たに必要になりました。
それに、ユニティちゃんを初期配置する処理も書かなくてはなりません。
なんせ、最初は地面がありませんから…

世界が構築された後、ブロックの上に着地するユニティちゃんが出現する仕組みを作ります。
開始位置を指定して、そのブロックが完成したら、一個上の場所にポップして、ブロック作成監視作業を終えるというのがベストだと思いますが
UniRx でそういった監視に便利な機能はないものですかね。

ありました。
qiita.com

毎秒監視を続けて、着地予定のチャンクメッシュコライダーが生成されたら、そこに着地するようにしてみます。
座標から、どうやってチャンクや、そのメッシュの位置を特定するのでしょうか?

ひらめきました!
なるほど、上空からレイキャストして、最初に当たったメッシュオブジェクトとその交点座標を使えばよいのか。

これでチャンクをメッシュ側から特定するという解決方法まで示すことができました。

続いて、カメラモードの切り替え機能を加えます。
まずは現在のオブザーバーモードを右スティックの押し込み操作で無効化します。

モード切替できるようになりました。
試験していて、淵を歩いているときに移動できないバグによく遭遇することを確認しました。
こちらはサンプルシーンを参考に、物理マテリアルを摩擦なしにすることで回避できました。

続いて、不具合としては、ジャンプしたときに移動レバーを倒していたら、そちらに移動してほしいというものがあります。

		void HandleAirborneMovement()
		{
			// apply extra gravity from multiplier:
			Vector3 extraGravityForce = (Physics.gravity * m_GravityMultiplier) - Physics.gravity + transform.forward * m_ForwardAmount * 5; // Air walk
			m_Rigidbody.AddForce(extraGravityForce);

こんな感じで、空中で加速度を進行方向に与えるようにして、空中移動できるようにした。

カメラの位置が壁にめり込む問題を解決したいので、目的のカメラ位置までピボットからレイを飛ばして、ヒットした位置にカメラを置くように修正してみました。
なかなかカメラ制御がうまくいかないですね。
と思っていたら、もともとのサンプルにカメラ制御のスクリプトがあったので、そちらを使うことにしました。
完ぺきではありませんが、とても優秀でした。

注視しているブロックを壊した後、その時にメッシュを更新する必要があります。
どのようにして効率的に、素早く更新できるのか、仕組みを考える必要があります。

そこで思いついたこととして、まずレイキャストとメッシュコライダーで三角形のインデックスを取得し、その三角形インデックスから頂点インデックスを取得し、その頂点インデックスから頂点座標を取得し
オブジェクトTransform から、世界座標系の頂点座標を取得し、メッシュ生成時のルールで頂点バッファの並びから、どの頂点がブロックの中心なのかを特定できるようにします。

良く思いついたなーなんて自分でも思います。
これで、ブロック単位で選択できるようになりそうです。
効率的にメッシュを更新する操作は、破壊についてはチャンクごとに新しいメッシュを作り直す必要がありますが、作成については、一度特定のブロック位置にブロックオブジェクトを配置して
その後、チャンクのメッシュを作って置き換えるというのはどうでしょうか?
これならばブロックの作成はノータイムで行えて、都合がよく、この一部のオブジェクトを個として切り離したり、置き換えたりする機能は
今後、落盤やブロックの一部落下の現象を作り出すのに使えそうです。

加えて、カメラモードはもう一つほしいですね。
FPSモード
www.youtube.com

追加しました!
いよいよ見ている対象ブロックを破壊する部分を実装していきます。
次回をお楽しみに