Unity備忘録33頁目「オブジェクトを制御してみるやつ」

江上宿六です。

 

相変わらず酒で酷い事になってますけど、反省で作業が捗るからリクエストでアウト。

f:id:y6yegami:20181215172551g:plain

移動出来るようになりました。 なんかもうゲーム感出てきたなあって。

gif上げるようになってファイル利用量が跳ね上がっててちょっと心配な所。

f:id:y6yegami:20181215173003p:plain

スクリプトはスティック入力で出来たベクトルを正規化、Normalizeした後に

移動量を設定し、カメラの向きを加味するように回転させたという感じです。

この回転のさせる文はあんま好きじゃ無い、代入文以外で別の方法無いかな。

ともかくこの後にtransform.positionに移動量を加えています。

 

上のgifでなんか箱が置いてありますが、これになんとか干渉したいわけです。

ぶつかって飛ばすのも別に良いですけど、過去にやったので違うことをですね。 

人だったら会話パートになったりしても良いですけど、物ですし持ち上げましょう。

 

まず、どういう風にアプローチをしたいかを考えるべきでしょうね。

自分としては自キャラの前に位置していたら、というのを取得したい感じです。

なのでとりあえずはこんな感じにしてみました。

f:id:y6yegami:20181215182423p:plain

キャラの前にSphereを生成し、適当にColliderのサイズを変えてみました。

このSphere自体は分かり易くする事を目的にしているだけなので、実際の場面では

見えないようにしておく必要がありますね。 このColliderに接触していて

かつオブジェクトに一番近い物に対してアクションを取れるようにしたいわけです。

f:id:y6yegami:20181217083609p:plain

当たり判定を行うにはRigidbodyが必要です。 この場合は箱ではなくこの判定用の

オブジェクトに加えるのが良いと思います。 加えて物理的な挙動をさせないので

UseGravityのチェックを外し、IsKinematicの方にもチェックを入れます。

 

こういう時の判定はOnCollisionではなくOnTriggerで行うのが良いと思うので

ColliderのIsTriggerにチェックを入れておきます。 これで大体準備完了です。

f:id:y6yegami:20181217090907p:plain

これは判定用のオブジェクトにアタッチするスクリプトで、主な判定部分です。

プレイヤーキャラと区別する為に箱の方にタグObjectを設定しています。

タグの設定方法はEdit→ProjectSettings→TagsAndLayersから行えます。

ともかく重なっているオブジェクトを回転させるという感じです。

f:id:y6yegami:20181217091639g:plain

このような感じでコライダーが重なっているオブジェクトが回転できます。

仮に表示させている球が小さいから若干正しくないように見えますが正常です。

次で少し直します。 あとパッド主体になったのでUIは無効にします。

f:id:y6yegami:20181217092851g:plain

しかしこの状態だと重なった状態のオブジェクト全てに干渉してしまいます。

もちろんこういう状態で処理を行うケースもあると思いますが、今回はこの中から

1つのオブジェクトを選んで回転させたいわけです。

 

これをOnTriggerStay内で判定するのは困難な気がするので、Update関数内で

一番近いオブジェクトを探し、重なっているなら回転させるという風にします。

f:id:y6yegami:20181217100809p:plain

試行錯誤の結果こんな感じです。 foreach文とFindGameObjectsWithTagを使い

Objectタグを持つGameObjectに対して処理を行うという感じになるんですかね。

 

判定用の球とforeach文で得られるobjとの距離をthis_rangeに入れ、それが

target_rangeより小さい、またはtarget_rangeが0の時にそのオブジェクトが

一番近いオブジェクトであるとし、距離と指定オブジェクトを更新しています。

f:id:y6yegami:20181217102237p:plain

OnTriggerStay内ですが、重なっているオブジェクトがその指定オブジェクトなら

回転をさせるという風にしました。 我ながら微妙だと思いますが今はこれで。

f:id:y6yegami:20181217102625g:plain

とりあえずは想定の通りに動いてくれています。 あとはこのオブジェクトに対して

色々と処理を施してやれば良いわけですが、だいぶ長くなったので次回にします。