質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

543閲覧

RigidbodyのSpeedが5,6フレーム毎に0になる

Eaphiel

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

3グッド

0クリップ

投稿2022/10/04 13:53

Windows11 Unity2021.3.11f.1
TPSのゲームでエルデンリングみたいなゲームを作っていて、RigidBody.Addforceでプレイヤーを移動させています。カメラの向きに対してWASDで移動し、RigidbodyのVelocityのXとZのsqrMagnitudeで速度の制限をします。

ですがRigidbodyのVelocityが5,6フレーム毎に0になり、思っているような動作にならないです。
Velocityの値で走るのと歩くアニメーションを切り替えているのでアニメーションがカクカクします。
また、移動速度が想定道理にいかないです。

ネットでいろいろ解決策を調べましたが、求めている情報がなく解決しませんでした。
また、2020.3.1f1のバージョンで作っていた同じゲームでは、まったく同じプログラムでRigidbodyの値も同じにしてもこの問題は起こりませんでした。
変わったこととしては、URPのプロジェクトでUnityChanSpringBoneとUniversalToonShaderforURPっていうPackageを使って(?)ます。
あとisSleeping()は常にFalseでした。

↓多分必要そうなの

void Update() { var horizontal = Input.GetAxis("Horizontal"); var vertical = Input.GetAxis("Vertical"); var cameraRotation = Quaternion.AngleAxis(cameraTransform.eulerAngles.y, Vector3.up); //Cameraの角度 var playerVector = cameraRotation * new Vector3(horizontal, 0, vertical).normalized;//進む方向 var velocity = new Vector2(rb.velocity.x, rb.velocity.z).sqrMagnitude; //Playerの速度 var speed = runSpeed; var speedLimit = runSpeedLimit; animator.SetFloat("Velocity", velocity); Debug.Log(velocity); //↓移動させてる if (velocity < speedLimit) { rb.AddForce(playerVector * speed, ForceMode.Accelaration); }

↓全文

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class PlayerController : MonoBehaviour { int health = 1000, stamina = 1000, mana = 1000; Transform playerTransform, cameraTransform; Rigidbody rb; Animator animator; Quaternion targetRotation; float runSpeed = 100, sprintSpeed = 200, runSpeedLimit = 15, sprintSpeedLimit = 30; bool moveable = true, staminable = true; enum playerState { LOCOMOTION, ATTACK, } playerState state = playerState.LOCOMOTION; void Awake() { Application.targetFrameRate = 60; } void Start() { playerTransform = gameObject.transform; cameraTransform = Camera.main.transform; rb = gameObject.GetComponent<Rigidbody>(); animator = gameObject.GetComponent<Animator>(); } void Update() { PlayerDead(); Move(); Attack(); } void Move() { var horizontal = Input.GetAxis("Horizontal"); var vertical = Input.GetAxis("Vertical"); var cameraRotation = Quaternion.AngleAxis(cameraTransform.eulerAngles.y, Vector3.up); //Cameraの角度 var playerVector = cameraRotation * new Vector3(horizontal, 0, vertical).normalized;//進む方向 var velocity = new Vector2(rb.velocity.x, rb.velocity.z).sqrMagnitude; //Playerの速度 var speed = runSpeed; var speedLimit = runSpeedLimit; animator.SetFloat("Velocity", velocity); Debug.Log(velocity); Debug.Log(rb.IsSleeping()); //回転 if (playerVector.sqrMagnitude >= 0.25f) { targetRotation = Quaternion.LookRotation(playerVector, Vector3.up); } transform.rotation = Quaternion.RotateTowards(playerTransform.rotation, targetRotation, 25.0f); //スタミナ if (stamina <= 1) { staminable = false; } else if (stamina >= 100) { staminable = true; } //移動速度 if (Input.GetKey(KeyCode.LeftShift) && staminable) { speed = sprintSpeed; speedLimit = sprintSpeedLimit; stamina--; } else { if (stamina < 1000) { stamina++; } } //移動 if (velocity < speedLimit) { rb.AddForce(playerVector * speed, ForceMode.Acceleration); ; } } }

↓Console
3.402671
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.402681
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.402676
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

0
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

14.47523
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.402697
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.40266
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.402676
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

3.402671
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

0
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

14.47524
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:52)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

False
UnityEngine.Debug:Log (object)
PlayerController:Move () (at Assets/Scripts/PlayerController.cs:53)
PlayerController:Update () (at Assets/Scripts/PlayerController.cs:38)

a.‫com, y_waiwai🎉を押しています

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

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

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

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

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

guest

回答1

0

ソースコードをあまり見てはいないのですが、起きている症状から判断して回答したいと思います。
継続的な力を加えるような処理(上記コードではAddForce関数)をUpdateで呼んではいけません。
※物理演算の更新のタイミング上、正しい挙動が行われなくなります。
FixedUpdate内で処理するようにしてください。

ただその際に注意ですが、入力処理(Input.GetAxis関数)はFixedUpdateにもっていかないようにしてください。
入力の受付タイミングはフレーム単位で行われており、FixedUpdateで処理しようとすると
入力を受け取れなくケースが発生します。

投稿2022/10/06 06:20

編集2022/10/06 06:22
Kerupim

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問