🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

1446閲覧

坂道で静止しても下に下がってしまう原因とは?

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2019/10/27 12:28

編集2019/10/27 12:52

提示コードコメント部の中身です。
提示画像の通り坂道の上にいるときに停止していてもプレイヤーの座標が動いてしまい常に下に下がっています。void FixedUpdateで動いてないときにゼロにするという処理を入れましたがそれでも別のどこかで何がかが起こっていると思われます。これはどうしたらいいのでしょうか?

また坂を上るりキーを離すと上に上がってしまうバグも発生していてそれはどうすればいいのでしょうか?

イメージ説明

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { const float walk_speed_max = 20.0f; Rigidbody rb; Vector3 move; float input_h; float input_v; Vector3 move_x; Vector3 move_z; public GameObject gGround; ground spt_g; bool isJump; bool isDush; bool isRay; float jump_force = 200.0f; float move_speed = walk_speed_max; Animator ani; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private Transform StepHit; private Transform Hit; private RaycastHit ray; const float ray_range = 0.3f;//レイを飛ばす距離 // 昇れる段差 private float stepOffset = 0.3f; // 昇れる角度 private float slopeLimit = 65f; // 昇れる段差の位置から飛ばすレイの距離 private float slopeDistance = 0.1f; private Vector3 v; // GameObject go = GameObject.Find("GameObject"); void move_step() { //y軸は逆にしてるプラスが下 Debug.DrawLine(transform.position + new Vector3(0f, stepOffset, 0f), transform.position + new Vector3(0f, stepOffset, 0f) + transform.forward * slopeDistance , Color.green); // Debug.Log(transform.forward * slopeDistance); float s = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); if (spt_g.isGround == true && s > 0) { if (Physics.Linecast(StepHit.position, StepHit.position + StepHit.forward * ray_range, out ray)) { if (Vector3.Angle(transform.up, ray.normal) <= slopeLimit) { v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, ray.normal) * transform.forward * move_speed).y, 0f) + transform.forward * move_speed; isRay = true; } else { //move += transform.forward * move_speed; } } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); spt_g = gGround.GetComponent<ground>(); ani = GetComponent<Animator>(); isJump = false; isDush = false; StepHit = transform.Find("StepRay"); } // Update is called once per frame void Update() { input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v; move_x = Camera.main.transform.right * input_h; move = move_x + move_z; //move.x *= move.x * move_speed; //move.z *= move.z * move_speed; if (move != Vector3.zero) { transform.rotation = Quaternion.LookRotation(move.normalized); } /*走る*/ if(Input.GetKey(KeyCode.RightControl)) { isDush = true; move_speed = 15.0f; } else { isDush = false; move_speed = walk_speed_max; } if(Input.GetKey(KeyCode.Space)) { if(spt_g.isGround == true && isJump == false) { isJump = true; } } move_step(); Animation_Mng(); } /*アニメーション管理*/ void Animation_Mng() { float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); ani.SetFloat("Move_Speed",speed); ani.SetBool("isDush",isDush); } private void FixedUpdate() { rb.velocity = new Vector3(move.x, rb.velocity.y, move.z); if(isJump == true) { rb.AddForce(rb.velocity.x,jump_force,rb.velocity.z); isJump = false; } float s = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); if(s == 0) { rb.velocity = new Vector3(0, rb.velocity.y, 0); } rb.AddForce(new Vector3(0, -10.0f, 0)); } private void OnCollisionEnter(Collision c) { // Debug.Log("プレイヤーcollision"); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KanazawaKureha

2019/10/27 13:28

Update()内のmoveの値が0なのか確認してください。 move == Vector3.zeroならば外部。 そうで無いならスクリプトに問題があるはずです。
退会済みユーザー

退会済みユーザー

2019/10/27 13:39

それは上に上がってしまうことについてでしょうか?
guest

回答1

0

FixedUpdateが行われるのは確か物理計算の直前です。

ですのでFixeUpdateで速度がゼロになった後、重力でわずかに加速しているためずり落ちているのだと思われます。

坂道に摩擦を設定すればおそらく解決します。

投稿2019/10/27 17:49

junkpar

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/08 14:16

質問ですが、ゼロフュージョンでしょうか?
退会済みユーザー

退会済みユーザー

2019/11/08 14:21

坂道にゼロフュージョンを設定しプレイヤーにもゼロフュージョンを設定しましたが以前少しずつ落ちていますどうすればいいのでしょうか?
junkpar

2019/11/10 07:55

ゼロフュージョンという言葉に聞き覚えがありません 質問者さんの他の質問から推測するに、フュージョンではなくfrictionのことでしょうか? zerofrictionというマテリアルを設定してる、ということですかね?
退会済みユーザー

退会済みユーザー

2019/11/10 13:17

はいそうです。
junkpar

2019/11/11 05:05

物理マテリアルは物体に対する摩擦力と反発係数の設定でしかなかったと思います 初期値はUnityの設定で決まっていて、個別に変更したい場合カスタムマテリアルを作成し設定するような感じです 名称も各自で決めるものなので、zerofrictionを設定してると言われても何とも言えません。 名称からしておそらく摩擦をゼロに設定しているのだろうな、とは推測できます
退会済みユーザー

退会済みユーザー

2019/11/11 09:43

つまりどうすればいいのでしょうか?坂道で停止したいのですが?
175

2019/11/11 13:19

物理マテリアルの設定方法は基本的なことなのでググってください。 junkparさんの仰るとおり坂道のオブジェクトかキャラクターに摩擦係数の高い物理マテリアルを設定すれば解決するはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問