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

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

ただいまの
回答率

90.75%

  • C#

    6539questions

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

  • Unity

    3568questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    756questions

Trigger処理について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 141

GOTOken

score 25

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Leaf : MonoBehaviour {

    public float leafAccelspeed;//Leaf加速度設定数値
    public bool leaf_PlayerFollow;//Leafオブジェクトの追尾機能 true false
    public float leafSpeed;//Leaf移動速度

    // Use this for initialization
    void Start () {
        leaf_PlayerFollow = false;


    }

    // Update is called once per frame
    void Update () {

        //Leaf UIオブジェクトの座標取得
       var leaf_pos = LeafUI.leaf_instance.transform.position;
        //Leafオブジェクトと Leaf UIの距離を計算する
        var distance = Vector3.Distance(leaf_pos, transform.localPosition);

        if (leaf_PlayerFollow)
        {
            //Leaf UIのいる位置へ導くベクトルの作成
            var direction = leaf_pos - transform.localPosition;
            direction.Normalize();

            transform.localPosition += direction * leafSpeed;

            leafSpeed += leafAccelspeed;
            return;
        }

    }


    private void OnTriggerEnter2D(Collider2D collision)
    {
      //Playerが当たったら、Leaf UIへのFollwを開始させる
        if(collision.gameObject.name == "Player")
        {
            leaf_PlayerFollow = true;
        }
        if (collision.gameObject.tag == "LeafUI")
        {
            Destroy(gameObject);//衝突時消滅   
            Debug.Log("消滅!");
        }

    }

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LeafUI : MonoBehaviour {


    public Text LeafCountText;//Leaf取得時増減用
    public GameObject LeafObj;
    public float LeafMagnetPower;//マグネットパワー用変数

    public static LeafUI leaf_instance;

    // Use this for initialization
    void Start () {
        leaf_instance = this;
    }

    // Update is called once per frame
    void Update () {

    }
    void OnTriggerEnter2D(Collider2D collision)
    {
        //Debug.Log("#");
        //if (collision.gameObject.tag=="Leaf")
        //{
        //    Destroy(gameObject);
        //}
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

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

 追記

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

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

    // Update is called once per frame
    void Update()
    {

        //Leaf UIオブジェクトの座標取得
        var leaf_pos = LeafUI.leaf_instance.transform.position;
        //Leafオブジェクトと Leaf UIの距離を計算する
        var distance = Vector3.Distance(leaf_pos, transform.localPosition);
        Debug.Log(distance);
        if (leaf_PlayerFollow)
        {
            //Leaf UIのいる位置へ導くベクトルの作成
            var direction = leaf_pos - transform.localPosition;
            direction.Normalize();

            //※残り距離がleafSpeed以下になったということは、今回の移動でUI葉っぱと衝突するということを意味するので、ここでLeafを削除してしまう
            if (distance <= leafSpeed)
            {
                Destroy(gameObject);//衝突時消滅   
                Debug.Log("消滅!");
            }

            //※残り距離がleafSpeed以下になればどうせ衝突したことになるので、移動量のクランプはやめました
            transform.localPosition += direction * leafSpeed;

            leafSpeed += leafAccelspeed;
            return;
        }

    }


    private void OnTriggerEnter2D(Collider2D collision)
    {
        //Playerが当たったら、Leaf UIへのFollwを開始させる
        if (collision.gameObject.name == "Player")
        {
            leaf_PlayerFollow = true;
        }
        //※OnTriggerEnter2DによるUI葉っぱとの衝突判定はしない...代わりにUpdate内で判定する
        /*
        if (collision.gameObject.tag == "LeafUI")
        {
            Destroy(gameObject);//衝突時消滅   
            Debug.Log("消滅!");
        }
        */
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/27 09:46

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

    キャンセル

  • 2018/05/27 10:05

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

    キャンセル

  • 2018/05/27 11:07

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

    キャンセル

  • 2018/05/27 12:18

    今回の場合、UIオブジェクトと明記していますが、そうではなく、カメラに親子関係にして常時UIと同じような仕組みを作ろうとしています。

    UI部分で、考えようとしましたが勉強不足である為こちらの方法でしか考える事が出来ませんでした。その為、どちらもtransform.localposition;で座標は取っています。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6539questions

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

  • Unity

    3568questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    756questions