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

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

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

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

Unity3D

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

Q&A

解決済

1回答

2518閲覧

Unity3D:RigidBodyの速度制限について

CraftTable

総合スコア234

C#

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

Unity3D

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

0グッド

0クリップ

投稿2020/10/17 13:48

編集2020/10/19 12:39

3Dアクションゲームを作っている者です
敵をRigidBodyで速度制限をかけ、最高速度=制限速度で移動ということをしたいのですが、
制限速度になったらその場で静止してしまっています
どのようにすれば同じ速度で移動できるでしょうか?
お願いしますm(_ _)m

スクリプトです
rb = キャラのRigidBody
MaxSpeed = 加速の際の最高値
MinSpeed = 加速の際の最低値
LimitSpeed = 制限速度

C#

1 rb.AddForce(transform.forward * Random.Range(MaxSpeed, MinSpeed), ForceMode.Impulse); 2 if (rb.velocity.magnitude > LimitSpeed) 3 { 4 rb.velocity = new Vector3(rb.velocity.x / 1.1f, rb.velocity.y, rb.velocity.z / 1.1f); 5 }

お願いします

追記
スクリプト全てが見たいとのことでしたのでここに貼ります
Target = 標的(プレイヤー)
WalkTargetPoint = NavMeshAgentで取得した向きを入れるVector3型変数

C#

1public class Enemy1Script : MonoBehaviour 2{ 3 [SerializeField] 4 NavMeshAgent nav; 5 public GameObject Target; 6 [SerializeField] 7 Rigidbody rb; 8 Vector3 WalkTargetPoint; 9 [SerializeField] 10 Animator anim; 11 [SerializeField] 12 float LimitSpeed; 13 [SerializeField] 14 float MaxSpeed; 15 [SerializeField] 16 float MinSpeed; 17 [SerializeField] 18 float HP; 19 [SerializeField] 20 float speed; 21 // Start is called before the first frame update 22 void Start() 23 { 24 Target = GameObject.Find("Player"); 25 HP = 100; 26 } 27 28 // Update is called once per frame 29 void Update() 30 { 31 speed = rb.velocity.magnitude; 32 nav.SetDestination(Target.transform.position); 33 if (nav.pathPending == false) 34 { 35 WalkTargetPoint = nav.path.corners[1]; 36 Quaternion Point = Quaternion.LookRotation(WalkTargetPoint - transform.position); 37 Point.x = 0; 38 Point.z = 0; 39 transform.rotation = Point; 40 if (Vector3.Distance(transform.position, Target.transform.position) >= 30 && rb.velocity.magnitude <= LimitSpeed) 41 { 42 rb.AddForce(transform.forward / Random.Range(MaxSpeed, MinSpeed), ForceMode.Impulse); 43 anim.SetBool("Run", true); 44 } 45 else if(Vector3.Distance(transform.position, Target.transform.position) <= 5 && rb.velocity.magnitude <= LimitSpeed) 46 { 47 rb.AddForce(-transform.forward / Random.Range(MaxSpeed, MinSpeed), ForceMode.Impulse); 48 anim.SetBool("Run", true); 49 } 50 else 51 { 52 anim.SetBool("Run", false); 53 anim.SetTrigger("1Attack"); 54 } 55 56 } 57 if (HP <= 0) 58 { 59 Destroy(gameObject); 60 } 61 } 62 63 void OnTriggerStay(Collider other) 64 { 65 if (other.gameObject.tag == "Hydrochloric Acid") 66 { 67 HP -= 0.01f; 68 rb.velocity = new Vector3(rb.velocity.x / 1.0005f, rb.velocity.y / 1.0005f, rb.velocity.z / 1.0005f); 69 } 70 } 71 void OnTriggerEnter(Collider other) 72 { 73 if (other.gameObject.tag == "Atack") 74 { 75 HP -= 10; 76 rb.AddForce(transform.forward * -100, ForceMode.Impulse); 77 } 78 } 79 void OnCollisionEnter(Collision collision) 80 { 81 if (collision.gameObject.tag == "Hydrochloric Acid") 82 { 83 if (collision.gameObject.name == "LastRE-ZA-") 84 { 85 HP -= 50; 86 } 87 else 88 { 89 HP -= 2; 90 } 91 } 92 } 93 void OnCollisionStay(Collision collision) 94 { 95 if (collision.gameObject.tag == "Hydrochloric Acid") 96 { 97 HP -= 5; 98 } 99 } 100}

このスクリプトだとrb.velocity.magnitudeが際限なく増え続けます(speedにmagnitudeを入れて表示してるのですがどこまでも増え続けてるのにオブジェクトは動きません)
無理だったらプロジェクト作り直しします
おねがいしますm(_ _)m

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

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

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

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

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

lazh

2020/10/17 14:43

そのコードを試しましたがこっちの環境では静止はしませんでした 別要因だと思いますが...
CraftTable

2020/10/19 10:38

本当ですか・・・ 前はこれ使ってたので動いてたので変だとは思ってましたが・・・ あとなぜか上記コードを使用してログにrb.velocity.magnitudeを表示するとrb.velocity.magnitudeが際限なく増え続けるという現象が発生しています これの解決方法は無いでしょうか・・・? 教えてくだされば幸いですm(_ _)m
lazh

2020/10/19 12:17

MaxSpeed = 1.0f; MinSpeed = 0.0f; LimitSpeed = 5.0f; でrb.velocity.magnitudeの値を見たら5未満の値でうろうろしてました 新しいシーンを作って、敵だけコピーしてプレイして、 正常な動作するまでスクリプト1個ずつ止めて試すしかないですね その敵に付いているコンポーネントの情報、付いてるスクリプト、参照しているスクリプトを全て中身も貼って貰ったらわかるかもしれないですが...
CraftTable

2020/10/19 12:33

ついているコンポーネントはNav Mesh Agent,Rigidbody,Capsule Colliderで、 つけてるスクリプトは質問させてもらったものを含むスクリプトだけです スクリプトの参照はしてないです Nav Mesh Agentで取得した経路探索の方向にRigidbody.Addforceで進むっていうスクリプトです スクリプトのほうは編集して投稿します
lazh

2020/10/19 13:29

> rb.velocity.magnitudeが際限なく増え続けます 敵のRigidbodyのuseGravityにチェックが入っていませんか? rb.velocity.magnitudeではなくrb.velocityの値を見るとyの値のマイナスがどんどん大きくなっていき、 useGravityを外すと増加は止まりました
CraftTable

2020/10/19 14:05

ありました 外すとしっかり移動してくれるようになりました ありがとうございます!m(_ _)m
lazh

2020/10/19 14:12

良かったです!ゲーム作成頑張ってくださいー
guest

回答1

0

自己解決

useGravityのチェックを外すことでできました
lazhさんありがとうございました!m(_ _)m

投稿2020/10/19 14:07

CraftTable

総合スコア234

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問