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

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

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

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

Q&A

解決済

1回答

2446閲覧

rigidbody2Dの慣性を無くしたいです。

yello

総合スコア9

C#

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

0グッド

0クリップ

投稿2018/08/23 08:00

編集2018/08/23 08:04

前提・実現したいこと

引用テキスト
Unityにて、2Dのシューティングゲームを作っているのですが、rigidbody2dの慣性を消したいと考えています。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7 8public class Player : MonoBehaviour 9{ 10 public int m_levelMax; // レベルの最大値 11 public int m_shotCountFrom; // 弾の発射数(レベルが最小値の時) 12 public int m_shotCountTo; // 弾の発射数(レベルが最大値の時) 13 public float m_shotIntervalFrom; // 弾の発射間隔(秒)(レベルが最小値の時) 14 public float m_shotIntervalTo; // 弾の発射間隔(秒)(レベルが最大値の時) 15 public float m_magnetDistanceFrom; // 宝石を引きつける距離(レベルが最小値の時) 16 public float m_magnetDistanceTo; // 宝石を引きつける距離(レベルが最大値の時) 17 public AudioClip m_levelUpClip; // レベルアップした時に再生する SE 18 public AudioClip m_damageClip; // ダメージを受けた時に再生する SE 19 public int m_nextExpBase; // 次のレベルまでに必要な経験値の基本値 20 public int m_nextExpInterval; // 次のレベルまでに必要な経験値の増加値 21 public int m_level; // レベル 22 public int m_exp; // 経験値 23 public int m_prevNeedExp; // 前のレベルに必要だった経験値 24 public int m_needExp; // 次のレベルに必要な経験値 25 public float m_magnetDistance; // 宝石を引きつける距離 26 public float m_speed; 27 public Shot m_shotPrefab; 28 public float m_shotSpeed; 29 public float m_shotAngleRange; 30 public float m_shotTimer; 31 public int m_shotCount; 32 public float m_shotInterval; 33 public int m_hpMax; // HP の最大値 34 public int m_hp; // HP 35 public static Player m_instance; 36 37 // ゲーム開始時に呼び出される関数 38 private void Awake() 39 { 40 m_instance = this; 41 m_hp = m_hpMax; // HP 42 m_level = 1; // レベル 43 m_needExp = GetNeedExp( 1 ); // 次のレベルに必要な経験値 44 m_shotCount = m_shotCountFrom; // 弾の発射数 45 m_shotInterval = m_shotIntervalFrom; // 弾の発射間隔(秒) 46 m_magnetDistance = m_magnetDistanceFrom; // 宝石を引きつける距離 47 } 48 49 private void Update() 50 { 51 var h = Input.GetAxis("Horizontal"); 52 var v = Input.GetAxis("Vertical"); 53 var velocity = new Vector3( h, v ) * m_speed; 54 transform.localPosition += velocity; 55 transform.localPosition = Utils.ClampPosition( transform.localPosition ); 56 var screenPos = Camera.main.WorldToScreenPoint( transform.position ); 57 var direction = Input.mousePosition - screenPos; 58 var angle = Utils.GetAngle( Vector3.zero,direction ); 59 var angles = transform.localEulerAngles; 60 angles.z = angle - 90; 61 transform.localEulerAngles = angles; 62 63 m_shotTimer += Time.deltaTime; 64 if ( m_shotTimer < m_shotInterval ) return; 65 m_shotTimer = 0; 66 ShootNWay( angle, m_shotAngleRange, m_shotSpeed, m_shotCount ); 67 } 68 private void ShootNWay( 69 float angleBase, float angleRange, float speed, int count ) 70 { 71 var pos = transform.localPosition; 72 var rot = transform.localRotation; 73 if ( 1 < count ) 74 { 75 for ( int i = 0; i < count; ++i ) 76 { 77 var angle = angleBase + 78 angleRange * ( ( float )i / ( count - 1 ) - 0.5f ); 79 var shot = Instantiate( m_shotPrefab, pos, rot ); 80 shot.Init( angle, speed ); 81 } 82 } 83 else if ( count == 1 ) 84 { 85 var shot = Instantiate( m_shotPrefab, pos, rot ); 86 shot.Init( angleBase, speed ); 87 } 88 } 89 // ダメージを受ける関数 90 // 敵とぶつかった時に呼び出される 91 public void Damage( int damage ) 92 { 93 // ダメージを受けた時の SE を再生する 94 var audioSource = FindObjectOfType<AudioSource>(); 95 audioSource.PlayOneShot( m_damageClip ); 96 // HP を減らす 97 m_hp -= damage; 98 99 // HP がまだある場合、ここで処理を終える 100 if ( 0 < m_hp ) return; 101 102 // プレイヤーが死亡したので非表示にする 103 // 本来であれば、ここでゲームオーバー演出を再生したりする 104 gameObject.SetActive( false ); 105 106 if ( 0 >= m_hp ) 107 {SceneManager.LoadScene("gameover");} 108 109 110 } 111 // 経験値を増やす関数 112 // 宝石を取得した時に呼び出される 113 public void AddExp( int exp ) 114 { 115 // 経験値を増やす 116 m_exp += exp; 117 118 // まだレベルアップに必要な経験値に足りていない場合、ここで処理を終える 119 if ( m_exp < m_needExp ) return; 120 121 // レベルアップする 122 m_level++; 123 124 // 今回のレベルアップに必要だった経験値を記憶しておく 125 // (経験値ゲージの表示に使用するため) 126 m_prevNeedExp = m_needExp; 127 128 // 次のレベルアップに必要な経験値を計算する 129 m_needExp = GetNeedExp( m_level ); 130 131 // レベルアップした時にボムを発動する 132 // ボムの発射数や速さは決め打ちで定義しているため 133 // 必要であれば public 変数にして、 134 // Unity エディタ上で設定できるように変更してください 135 var angleBase = 0; 136 var angleRange = 360; 137 var count = 28; 138 ShootNWay( angleBase, angleRange, 0.15f, count ); 139 ShootNWay( angleBase, angleRange, 0.2f, count ); 140 ShootNWay( angleBase, angleRange, 0.25f, count ); 141 // レベルアップした時の SE を再生する 142 var audioSource = FindObjectOfType<AudioSource>(); 143 audioSource.PlayOneShot( m_levelUpClip ); 144 145 // レベルアップしたので、各種パラメータを更新する 146 var t = ( float )( m_level - 1 ) / ( m_levelMax - 1 ); 147 m_shotCount = Mathf.RoundToInt( 148 Mathf.Lerp( m_shotCountFrom, m_shotCountTo, t ) ); // 弾の発射数 149 m_shotInterval = Mathf.Lerp( 150 m_shotIntervalFrom, m_shotIntervalTo, t ); // 弾の発射間隔(秒) 151 m_magnetDistance = Mathf.Lerp( 152 m_magnetDistanceFrom, m_magnetDistanceTo, t ); // 宝石を引きつける距離 153 } 154 // 指定されたレベルに必要な経験値を計算する関数 155 private int GetNeedExp( int level ) 156 { 157 /* 158 * 例えば、m_nextExpBase が 16、m_nextExpInterval が 18 の場合、 159 * 160 * レベル 1:16 + 18 * 0 = 16 161 * レベル 2:16 + 18 * 1 = 34 162 * レベル 3:16 + 18 * 4 = 88 163 * レベル 4:16 + 18 * 9 = 178 164 * 165 * このような計算式になり、レベルが上がるほど必要な経験値が増えていく 166 */ 167 return m_nextExpBase + 168 m_nextExpInterval * ( ( level - 1 ) * ( level - 1 ) ); 169 } 170} 171

試したこと

2Dではなく、ただのrigidbodyの慣性を消す方法はインターネットにあったのですが、2Dの場合はありませんでした。

補足情報(FW/ツールのバージョンなど)

Unity 2017.4.1f1 Personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

Rigidbody2DにもvelocityangularVelocityがあるので、それを変更するだけだと思いますが、それは試されましたか?
(なお、型が違う(velocityはVector2、angularVelocityはfloat)ので、そこは注意してください)


なお、Unityの質問であれば、Unityタグも一緒に付けるとよいです。

投稿2018/08/23 08:10

編集2018/08/23 08:11
fiveHundred

総合スコア9739

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

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

yello

2018/08/23 08:21

回答ありがとうございます。 rigidbody.velocity = Vector3.zero; rigidbody.angularVelocity = Vector3.zero; インターネットでこのようなソースを見つけたのですが、これを少し書き換えればできますでしょうか? また、もしできるのであればどうやって書き換えればいいのでしょうか。 …まだ初心者なので馬鹿みたいな質問をしているかもしれませんが…ご容赦ください。
yello

2018/08/23 08:24

タグに関するご指導もありがとうございます。 以後気を付けさせていただきます。
fiveHundred

2018/08/23 08:26

Rigidbody2Dは「GetComponent<Rigidbody2D>();」を使えば取得できます。 なので、以下のようにすれば同等のことができると思います。 Rigidbody2D rigidbody2d = GetComponent<Rigidbody2D>(); rigidbody2d.velocity = Vector2.zero; rigidbody2d.angularVelocity = 0f; 蛇足ですが、rigidbodyプロパティは廃止または非推奨になっているので、現在は同様に「GetComponent<Rigidbody>();」で取得するのが普通です。
yello

2018/08/23 09:06

なるほど!なんとか解決しそうです! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問