前提・実現したいこと
引用テキスト
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/23 08:21
2018/08/23 08:24
2018/08/23 08:26
2018/08/23 09:06