teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

リンク追加

2020/06/25 11:58

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -119,4 +119,4 @@
119
119
 
120
120
  **▼ System.Math.Abs(distance) < 0.01f**
121
121
  C#のfloatで a == 0は正しい結果が返らない時があります。fpsによって0にならない可能性もあります。
122
- なので必ず 大なり(>) 小なり(<) を使います。今回のようにそれだけでは成り立たない場合Math.Absで絶対値に変換して計算するのがおすすめです。[Mathf.Approximately](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Approximately.html)という渡された2つのfloatが大体同じか確認する関数もありますが、僕は使ったことないです。
122
+ なので必ず 大なり(>) 小なり(<) を使います。今回のようにそれだけでは成り立たない場合[Math.Abs](https://docs.microsoft.com/ja-jp/dotnet/api/system.math.abs?view=netcore-3.1)で絶対値に変換して計算するのがおすすめです。[Mathf.Approximately](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Approximately.html)という渡された2つのfloatが大体同じか確認する関数もありますが、僕は使ったことないです。

2

追記

2020/06/25 11:58

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -119,4 +119,4 @@
119
119
 
120
120
  **▼ System.Math.Abs(distance) < 0.01f**
121
121
  C#のfloatで a == 0は正しい結果が返らない時があります。fpsによって0にならない可能性もあります。
122
- なので必ず 大なり(>) 小なり(<) を使います。今回のようにそれだけでは成り立たない場合Math.Absで絶対値に変換して計算するのがおすすめです。
122
+ なので必ず 大なり(>) 小なり(<) を使います。今回のようにそれだけでは成り立たない場合Math.Absで絶対値に変換して計算するのがおすすめです。[Mathf.Approximately](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Approximately.html)という渡された2つのfloatが大体同じか確認する関数もありますが、僕は使ったことないです。

1

ヒントの追加

2020/06/25 11:51

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -102,4 +102,21 @@
102
102
 
103
103
  ### サンプルプロジェクト
104
104
  SolidierMoveTest.unitypackage
105
- [https://19.gigafile.nu/0824-de8c99927f01c7db326bf99c2ac8004bf](https://19.gigafile.nu/0824-de8c99927f01c7db326bf99c2ac8004bf)
105
+ [https://19.gigafile.nu/0824-de8c99927f01c7db326bf99c2ac8004bf](https://19.gigafile.nu/0824-de8c99927f01c7db326bf99c2ac8004bf)
106
+
107
+ ### コードのヒント
108
+
109
+ **▼ 「Transform parent」**
110
+ transformは参照(transform.position = など)する度に内部的に取得処理を行なっております。
111
+ Updateなどフレーム単位でアクセスが必要な場合はparent = transformなどとしてキャッシュした方が高速に動作します。今回のようにインスペクタから設定するのが最速なのでおすすめです。
112
+
113
+ **▼ 「void Reset()」**
114
+ インスペクタから設定するのが最速と言いましたが、毎回設定するのは面倒です。
115
+ そこでResetを使うと便利です。Reset内に取得設定処理parent = transformを書くことでスクリプトをアタッチした時やインスペクタからアタッチしたスクリプトの右上の歯車マーク > Resetを選択するとResetが走ります。
116
+
117
+ **▼ var distance = ((Vector2)parent.position - targetPos).sqrMagnitude;**
118
+ Magnitudeはルートを使って計算するので重いです。距離を測る程度であればsqrMagnitudeで十分なのでこっちを使ってください。
119
+
120
+ **▼ System.Math.Abs(distance) < 0.01f**
121
+ C#のfloatで a == 0は正しい結果が返らない時があります。fpsによって0にならない可能性もあります。
122
+ なので必ず 大なり(>) 小なり(<) を使います。今回のようにそれだけでは成り立たない場合Math.Absで絶対値に変換して計算するのがおすすめです。