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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

263閲覧

Trigger処理について

GOTOken

総合スコア54

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/05/25 10:59

イメージ説明
gif画像のように葉っぱのようなものをUIの葉っぱへ飛ばし、当たれば消滅。といった処理を考えていたのですが、飛んでいくと消えるオブジェクト、消えないオブジェクトの2つが存在しています。
消えないオブジェクトは弾かれたかのような挙動をとります。

解決策として、飛ぶ速度が早すぎるからでは?と思い、数値を落としてみたものの、成果が得られませんでした。
長文になりますが↓がソースコードになっております。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Leaf : MonoBehaviour { 6 7 public float leafAccelspeed;//Leaf加速度設定数値 8 public bool leaf_PlayerFollow;//Leafオブジェクトの追尾機能 true false 9 public float leafSpeed;//Leaf移動速度 10 11 // Use this for initialization 12 void Start () { 13 leaf_PlayerFollow = false; 14 15 16 } 17 18 // Update is called once per frame 19 void Update () { 20 21 //Leaf UIオブジェクトの座標取得 22 var leaf_pos = LeafUI.leaf_instance.transform.position; 23 //Leafオブジェクトと Leaf UIの距離を計算する 24 var distance = Vector3.Distance(leaf_pos, transform.localPosition); 25 26 if (leaf_PlayerFollow) 27 { 28 //Leaf UIのいる位置へ導くベクトルの作成 29 var direction = leaf_pos - transform.localPosition; 30 direction.Normalize(); 31 32 transform.localPosition += direction * leafSpeed; 33 34 leafSpeed += leafAccelspeed; 35 return; 36 } 37 38 } 39 40 41 private void OnTriggerEnter2D(Collider2D collision) 42 { 43      //Playerが当たったら、Leaf UIへのFollwを開始させる 44 if(collision.gameObject.name == "Player") 45 { 46 leaf_PlayerFollow = true; 47 } 48 if (collision.gameObject.tag == "LeafUI") 49 { 50 Destroy(gameObject);//衝突時消滅 51 Debug.Log("消滅!"); 52 } 53 54 } 55 56} 57

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class LeafUI : MonoBehaviour { 7 8 9 public Text LeafCountText;//Leaf取得時増減用 10 public GameObject LeafObj; 11 public float LeafMagnetPower;//マグネットパワー用変数 12 13 public static LeafUI leaf_instance; 14 15 // Use this for initialization 16 void Start () { 17 leaf_instance = this; 18 } 19 20 // Update is called once per frame 21 void Update () { 22 23 } 24 void OnTriggerEnter2D(Collider2D collision) 25 { 26 //Debug.Log("#"); 27 //if (collision.gameObject.tag=="Leaf") 28 //{ 29 // Destroy(gameObject); 30 //} 31 } 32} 33

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

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

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

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

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

guest

回答1

0

ベストアンサー

飛ぶ速度が速すぎるという説はもっともらしいですね。
ご提示いただいた葉っぱの動きを見てみると、最初はUI葉っぱへまっすぐ飛んでいき、UI葉っぱまで到達すると点滅しながら遠ざかっているように見えます。
おそらく...

  1. UI葉っぱへ向かって移動する。1回の移動量はどんどん大きくなっていく。
  2. 移動量が十分大きくなると、UI葉っぱにヒットせず通り過ぎる。
  3. UI葉っぱとの位置関係が逆転し、移動方向が逆転する。
  4. 移動量はさらに増加し、またUI葉っぱを通り過ぎる。
  5. UI葉っぱとの位置関係が逆転し、移動方向が逆転する。
  6. これを繰り返し、反復横跳びのような動きでUI葉っぱから遠ざかっていく。

なんて状況ではないでしょうか。
UI葉っぱを追い越さないように、移動量をクランプしてみるとどうでしょうかね?

C#

1// 移動量がdistanceを越えないようにクランプしてから現在位置に加算 2transform.localPosition += Vector3.ClampMagnitude(direction * leafSpeed, distance); 3// または、下記のようなクランプ方法の方が、計算量が少し小さくなるかもしれませんね 4// transform.localPosition += direction * Mathf.Min(leafSpeed, distance);

追記

飛んでいった葉っぱが止まったということは、どうやら葉っぱがUI葉っぱの位置まで到達してはいるようですね。それなのにOnTriggerEnter2Dが作動しないということは、コライダーの形状の問題でしょうかね?
フィールド上の葉っぱオブジェクトとUI葉っぱオブジェクトのワールド座標をぴったり同じにした時、コライダー同士が接触しているでしょうか。もし接触していなければ、ちゃんと重なり合いが生じるようにコライダーを調整してみるといいかもしれません。

別案として、いっそのこと飛んでいく葉っぱとUI葉っぱの衝突検出はOnTriggerEnter2Dに頼らず、両者の距離で判定してしまうというのはどうでしょう?
多分、このプレイヤーが葉っぱに触れるとUI葉っぱの方へ飛んでいくという動きは、葉っぱを入手したことを視覚的にわかりやすくするために作った演出かと思います。でしたら、フィールド葉っぱとUI葉っぱがちゃんとそれらの形状に合わせて衝突するようにしなくとも問題ない気がします。
たとえば下記のように、UI葉っぱまでの残り距離が1フレームでの移動量を下回ったら、その時点でUI葉っぱまで到達したものと見なしてしまう...というのはいかがでしょうか。

C#

1 // Update is called once per frame 2 void Update() 3 { 4 5 //Leaf UIオブジェクトの座標取得 6 var leaf_pos = LeafUI.leaf_instance.transform.position; 7 //Leafオブジェクトと Leaf UIの距離を計算する 8 var distance = Vector3.Distance(leaf_pos, transform.localPosition); 9 Debug.Log(distance); 10 if (leaf_PlayerFollow) 11 { 12 //Leaf UIのいる位置へ導くベクトルの作成 13 var direction = leaf_pos - transform.localPosition; 14 direction.Normalize(); 15 16 //※残り距離がleafSpeed以下になったということは、今回の移動でUI葉っぱと衝突するということを意味するので、ここでLeafを削除してしまう 17 if (distance <= leafSpeed) 18 { 19 Destroy(gameObject);//衝突時消滅 20 Debug.Log("消滅!"); 21 } 22 23 //※残り距離がleafSpeed以下になればどうせ衝突したことになるので、移動量のクランプはやめました 24 transform.localPosition += direction * leafSpeed; 25 26 leafSpeed += leafAccelspeed; 27 return; 28 } 29 30 } 31 32 33 private void OnTriggerEnter2D(Collider2D collision) 34 { 35 //Playerが当たったら、Leaf UIへのFollwを開始させる 36 if (collision.gameObject.name == "Player") 37 { 38 leaf_PlayerFollow = true; 39 } 40 //※OnTriggerEnter2DによるUI葉っぱとの衝突判定はしない...代わりにUpdate内で判定する 41 /* 42 if (collision.gameObject.tag == "LeafUI") 43 { 44 Destroy(gameObject);//衝突時消滅 45 Debug.Log("消滅!"); 46 } 47 */ 48 }

投稿2018/05/25 21:37

編集2018/05/27 05:30
Bongo

総合スコア10807

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

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

GOTOken

2018/05/27 00:46

丁寧にありがとうございます! プログラムの改変を行ったところ、Triggerのある場所まで届かなくなってしまったのですが、その場合はどこの数値を変更すれば治りますか、。?
GOTOken

2018/05/27 01:05

具体的には、Leaf UIの位置の手前で静止してしまっています。
Bongo

2018/05/27 02:07

お伺いしますが、LeafとLeaf UIの座標系はそれぞれどうなっているでしょうか? Leaf UIは名前からしておそらくUIオブジェクトであり、何らかのCanvasの子階層に存在していて、インスペクタにはTransformの代わりにRect Transformが表示されているのだろうかと思います。 一方、LeafのインスペクタではTransformとRect Transformのどちらが使われているでしょうか。 この辺の設計によっては、座標比較の際に両者の座標系の違いを考慮してやる必要がありそうです。
GOTOken

2018/05/27 03:18

今回の場合、UIオブジェクトと明記していますが、そうではなく、カメラに親子関係にして常時UIと同じような仕組みを作ろうとしています。 UI部分で、考えようとしましたが勉強不足である為こちらの方法でしか考える事が出来ませんでした。その為、どちらもtransform.localposition;で座標は取っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問