Unityで横スクロールの2Dアクションゲームを作っています。
制作の際、解決できない問題が発生してしまったため、質問します。
2Drigidbodyと2Dboxcoliderを用いてプレイヤーキャラクターとステージに当たり判定を設けたのですが、プレイヤーがステージに上から接する(落ちる、歩くなど)場合は問題なく当たり判定が作用するのですが、横からステージにぶつかった場合にぬるっとステージ内に入り込みながらステージ上部分に上昇するような動作をしてしまうようになってしましました。ちゃんと壁にぶつかるようにするにはどうしたらいいでしょうか?
キャラクターの移動方はどのようにしていますか?
キャラクターの移動スクリプトの提示をお願いします。
スクリプトが無い現状で憶測で語るなら、恐らくはTransformで移動しているのではないかなと思うのですが、壁にぶつかった際のめりこみはキャラクターがTransformによる直接の座標書き換えで壁の中にめり込んでしまい、コライダー同士の反発で上昇するような動きになっているかもしれません。
キャラクター移動のスクリプトはこちらになります。
(スクリプトより一部抜粋)
// 現在位置をPositionに代入
Vector2 Position = transform.position;
if (Input.GetKey("left") || Input.GetKey(KeyCode.A))
{
// 左キーを押し続けていたら
// 代入したPositionに対して加算減算を行う
Position.x -= SPEED.x;
}
if (Input.GetKey("right") || Input.GetKey(KeyCode.D))
{
// 右キーを押し続けていたら
// 代入したPositionに対して加算減算を行う
Position.x += SPEED.x;
}
// 現在の位置に加算減算を行ったPositionを代入する
transform.position = Position;
解答者様がおっしゃっているとおり、transform.positionを利用した処理になっています。
この方法だと、壁の中にめり込んでしまう動きになってしまうということでしょうか?
簡単に知ってしまえば、現在yuinekoさんが使っている移動方法は「ごく短いワープを連続して行い、あたかも平行移動している」状態です。座標を書き換えているので、例えば壁が移動途中にあっても、壁の中に入り込む可能性があります。
そのため、Rigidbodyが付いているのであれば2D、3Dともに基本的に移動は.veloctityという加速を用いて移動する方法が望ましいです。この辺は「Unity 2D 移動方法」で検索するといろいろ記事が出てきます。
今回は私のおすすめ記事を添付しておくので、参考にしてみてください。
https://dkrevel.com/makegame-beginner/make-2d-aciton-move
横から失礼します。
一応念のため補足ですが、Unity公式ではvelocty(速度)を直接操作することは非推奨になっています。https://docs.unity3d.com/ja/2018.4/ScriptReference/Rigidbody-velocity.html
また、実装方法によりけりですがvelocityを基本的な移動手段にしてしまうと、Unityで補完してくれている物理演算が出来なくなりジャンプや壁に跳ね返る等の処理に少し工夫する必要が出てきます。
なので、Y0241-Nさんが貼って頂いた記事にも書いてありますが、基本的には物理的挙動をさせない場合に有用です。
ついでに、positionを使いたい場合は、昔からある方法ですが移動先が移動可能かどうか走査し可能であれば移動するみたいな感じで出来なくは無いです。
どの方法でも問題無いですが、後々の影響を考えてどれが適切か考えておくと苦労が減るかもしれません。
お二方とも丁寧なご説明ありがとうございます。
ゲームデザインに合わせてどの方法が良いか検討したいと思います。
simapiko様、至らぬ箇所の補足をありがとうございます。勉強になりました。
veloctiyを変更するよりは、AddFroceで動かす方がよさそうですね。
回答1件
あなたの回答
tips
プレビュー