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

回答編集履歴

2

別の案を追記

2018/05/27 05:30

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -17,4 +17,63 @@
17
17
  transform.localPosition += Vector3.ClampMagnitude(direction * leafSpeed, distance);
18
18
  // または、下記のようなクランプ方法の方が、計算量が少し小さくなるかもしれませんね
19
19
  // transform.localPosition += direction * Mathf.Min(leafSpeed, distance);
20
+ ```
21
+
22
+ ### 追記
23
+ 飛んでいった葉っぱが止まったということは、どうやら葉っぱがUI葉っぱの位置まで到達してはいるようですね。それなのにOnTriggerEnter2Dが作動しないということは、コライダーの形状の問題でしょうかね?
24
+ フィールド上の葉っぱオブジェクトとUI葉っぱオブジェクトのワールド座標をぴったり同じにした時、コライダー同士が接触しているでしょうか。もし接触していなければ、ちゃんと重なり合いが生じるようにコライダーを調整してみるといいかもしれません。
25
+
26
+ 別案として、いっそのこと飛んでいく葉っぱとUI葉っぱの衝突検出はOnTriggerEnter2Dに頼らず、両者の距離で判定してしまうというのはどうでしょう?
27
+ 多分、このプレイヤーが葉っぱに触れるとUI葉っぱの方へ飛んでいくという動きは、葉っぱを入手したことを視覚的にわかりやすくするために作った演出かと思います。でしたら、フィールド葉っぱとUI葉っぱがちゃんとそれらの形状に合わせて衝突するようにしなくとも問題ない気がします。
28
+ たとえば下記のように、UI葉っぱまでの残り距離が1フレームでの移動量を下回ったら、その時点でUI葉っぱまで到達したものと見なしてしまう...というのはいかがでしょうか。
29
+
30
+ ```C#
31
+ // Update is called once per frame
32
+ void Update()
33
+ {
34
+
35
+ //Leaf UIオブジェクトの座標取得
36
+ var leaf_pos = LeafUI.leaf_instance.transform.position;
37
+ //Leafオブジェクトと Leaf UIの距離を計算する
38
+ var distance = Vector3.Distance(leaf_pos, transform.localPosition);
39
+ Debug.Log(distance);
40
+ if (leaf_PlayerFollow)
41
+ {
42
+ //Leaf UIのいる位置へ導くベクトルの作成
43
+ var direction = leaf_pos - transform.localPosition;
44
+ direction.Normalize();
45
+
46
+ //※残り距離がleafSpeed以下になったということは、今回の移動でUI葉っぱと衝突するということを意味するので、ここでLeafを削除してしまう
47
+ if (distance <= leafSpeed)
48
+ {
49
+ Destroy(gameObject);//衝突時消滅
50
+ Debug.Log("消滅!");
51
+ }
52
+
53
+ //※残り距離がleafSpeed以下になればどうせ衝突したことになるので、移動量のクランプはやめました
54
+ transform.localPosition += direction * leafSpeed;
55
+
56
+ leafSpeed += leafAccelspeed;
57
+ return;
58
+ }
59
+
60
+ }
61
+
62
+
63
+ private void OnTriggerEnter2D(Collider2D collision)
64
+ {
65
+ //Playerが当たったら、Leaf UIへのFollwを開始させる
66
+ if (collision.gameObject.name == "Player")
67
+ {
68
+ leaf_PlayerFollow = true;
69
+ }
70
+ //※OnTriggerEnter2DによるUI葉っぱとの衝突判定はしない...代わりにUpdate内で判定する
71
+ /*
72
+ if (collision.gameObject.tag == "LeafUI")
73
+ {
74
+ Destroy(gameObject);//衝突時消滅
75
+ Debug.Log("消滅!");
76
+ }
77
+ */
78
+ }
20
79
  ```

1

Minによるクランプも追記

2018/05/27 05:30

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -15,4 +15,6 @@
15
15
  ```C#
16
16
  // 移動量がdistanceを越えないようにクランプしてから現在位置に加算
17
17
  transform.localPosition += Vector3.ClampMagnitude(direction * leafSpeed, distance);
18
+ // または、下記のようなクランプ方法の方が、計算量が少し小さくなるかもしれませんね
19
+ // transform.localPosition += direction * Mathf.Min(leafSpeed, distance);
18
20
  ```