Unityを使って2Dアクションゲームを作っています。プレイヤーとして、地形の少し上を漂いつつ移動するキャラクターを作りたいのですが、実装がうまくいきません。
C#
1 2 int layer = LayerMask.GetMask("Stage"); 3 Vector3 start = transform.position; 4 Vector3 end = start - m_floatHeight * transform.up; 5 RaycastHit2D hitInfo = new RaycastHit2D 6 { 7 distance = Mathf.Infinity, 8 }; 9 10 hitInfo =Physics2D.Linecast(start, end, layer); 11 12 if (hitInfo.distance !=Mathf.Infinity) 13 { 14 Vector2 p = transform.position; 15 p.y += (m_floatHeight - hitInfo.distance); 16 transform.position = p; 17 } 18 19(Stage : 足場のオブジェクトの属するレイヤー 20m_floatHeight : 浮かぶ時の地面からの高さ)
上のようなコードを組み実装しました。途中まではうまくいくのですが、数秒の後、(何も操作せずとも)急にy座標がぶれだしてキャラクターが無限のかなたに飛んで行ってしまいます。
どのようにすれば改善するでしょうか。
このコードはUpdateの中にありますか? このオブジェクトに重力は掛かっていますか? また、Debug.Log(hitInfo.distance);を入れて実行するとどんな値を取っていますか?
コメントありがとうございます。このコードはUpdate()の中にあり、重力はかかっています。Debug.Logですが、ゲーム開始時はm_floatHeightの値を持っているのですが、だんだんと値が小さくなっていっていました。しかし画面上のオブジェクトの位置はそのままです。値がある程度小さくなるとぶれが始まり、質問文にあるような現象が起きます。
一応確認ですが、自分のコライダー等のレイヤーが"Stage"になっていたりしませんか? hitInfo.distanceが小さくなっているのに画面上の位置はそのままというと、本来の地面オブジェクトにRayが当たっていないように思います。(hitInfo.transform.nameで当たったオブジェクトの名前取れるので確認してみてください)
返信ありがとうございます。今、1通目の返信の「重力」のワードがよい示唆となり解決できました。レイヤー等の設定は正しかったのですが、Rigidbodyの重力を切って自前でRigidbodyのvelocityを操作することでうまくいきました。恐らくpositionをコードで書き換えてるのに速度だけはRigidbodyのgravityで加算され続けたのが原因なのではないかと思っています。
そうですね、その辺は怪しそうだとは思ってました(あとFixedUpdateの中に無いので、判定タイミングが若干ずれてそうだなーとも。velocityとpositionの自前操作も危険ではありそうですが……)。とりあえず解決したのであれば自己回答&解決お願いします。
ありがとうございました。
回答2件
あなたの回答
tips
プレビュー