読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

イベントHitが発生しない問題・解決編

妹「HitじゃなくてOverlapにしてみようと思ってたんだけど、ノードにカーソル合わせてみると、何か気になる文章が出てきたんだけど……」

f:id:una_unagi:20150809165557p:plain

妹「言ってる意味はよくわからないけど、CharacterMovementとか、PhysicsをONにするとか、SetActerLocationでSweepをONにしないと動きませんって書いてある気がする」

「言ってる意味はよくわからないけど確かにそんな風に見える。CharacterMovementでもPhysicsでもないから、Sweepでってことになるけど、でもSweepはONにしても動き方変わらなかったんだけどな?」

妹「じゃあバグ?」

「ちょっとSetActorLocationのドキュメントを見てみる」

docs.unrealengine.com

「あっ……」

Should we sweep to the destination location, stopping short of the target if blocked by something. Note:If the root component has no collision this will have no effect.

妹「なんて書いてあるのだ?」

「Sweep状態だと途中でブロックされて予定より短い距離で止まるよ。でもrootコンポーネントコリジョンを持ってなかったら効果ないから気を付けてね……みたいな事が書いてある」

f:id:una_unagi:20150809172751p:plain

「rootコンポーネントというのは、この場合Sceneってやつになるんだけど」

妹「MoveComponentTo使う時にルートからの相対位置で指定するから、それ用に作ったやつだ」

「このSceneはコリジョンは持ってない。PaperSpriteコンポーネントにBlockのコリジョンを設定してるから、これをrootに持ってきて、使ってないはSceneを消す」

f:id:una_unagi:20150809173106p:plain

「こういう風にするとHITするようになる」

妹「コリジョンってrootにないと駄目だったのか」

「いやroot以外のコリジョンも有効なんだけど、rootにも何か無いと他のも効かないみたい」

妹「rootのコリジョンはBlockじゃないと駄目なの? Overlapとか」

「試してみた感じだとrootのコリジョンでBlockしてる場合だけ、他のBlockも有効になる感じ。Overlapを親にすると全体的に透けてしまう」

妹「うーん、そうするとCharacterのコリジョンはカプセル型以外に出来ないってことなのかな? カプセル無効にするとHitしなくなるわけだし。Y軸を思いっきりずらして、反応しないようにすればいいのかな。」

「形の問題ならrootのコリジョンを小さくして、それより大きいのを子につければ大丈夫だけど、基本的にはrootに中心部分のBlockコリジョンを置くのが良さそう」

妹「ようやく長く続いたHitとの戦いが終わった……」