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

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

ただいまの
回答率

88.78%

Unity2D オブジェクト同士の当たり判定を別のオブジェクトのスクリプトでも取得したい

解決済

回答 1

投稿

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

creatorsGame

score 18

今、Agar.io×スプラトゥーンみたいな2Dゲームを開発しています。ゲームを開始するとランダムにプレイヤーの色が変更され、変更されたプレイヤーの色と同じ色に弾の色を変更し、プレイヤーが発射した弾が2Dサークルコライダーを離れると弾が消去され、消去された座標に同じ色のタイルが生成されるプログラムを書きました。
次は、弾が2Dサークルコライダーを離れてもタイルのコライダーに接触していれば消去されないようにしたいです。自分でコードを書いてみたのですが、上手くできません。なので、タイルと弾のコライダーの当たり判定をMoveスクリプトで取得するか、その他で出来る方法があれば教えてください。 
長文ですみません。  
イメージ説明イメージ説明

Move

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

public class Move : MonoBehaviour
{
    public GameObject Bullet;
    public GameObject Tile;
    public float Speed;
    public float ShotSpeed;
    private ColorRandom colorComp;

    //追加
    void Start()
    {
        //MoveとColorRandomは同じオブジェクトに付いていることを前提としています
        colorComp = GetComponent<ColorRandom>();
    }

    void Update()
    {
        //マウスの位置に移動
        Vector3 Target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Target.z = transform.position.z;

        transform.position = Vector2.MoveTowards(transform.position, Target, Speed * Time.deltaTime);

        //マウスの方向を向く
        var pos = Camera.main.WorldToScreenPoint(transform.localPosition);
        var rotation = Quaternion.LookRotation(Vector3.forward, Input.mousePosition - pos);
        transform.localRotation = rotation;


        if (Input.GetMouseButtonDown(0))
        {
            // 弾(ゲームオブジェクト)の生成
            GameObject clone = Instantiate(Bullet, transform.position, Quaternion.identity);

            // 色反映
            clone.GetComponent<Renderer>().material.color = colorComp.playerColor;

            // クリックした座標の取得(スクリーン座標からワールド座標に変換)
            Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            // 向きの生成(Z成分の除去と正規化)
            Vector3 shotForward = Vector3.Scale((mouseWorldPos - transform.position), new Vector3(1, 1, 0)).normalized;

            // 弾に速度を与える
            clone.GetComponent<Rigidbody2D>().velocity = shotForward * ShotSpeed;
        }
    }
    //弾(ball)がColliderから離れた時の処理
    void OnTriggerExit2D(Collider2D col)
    {

        if (col.gameObject.tag == "PaintBullet")
        {

            GameObject[] Bullets = GameObject.FindGameObjectsWithTag("PaintBullet");
            foreach (GameObject Bullet in Bullets)
            {
                GameObject Tileclone = Instantiate(Tile, Bullet.transform.position, Quaternion.identity);
                Tileclone.GetComponent<Renderer>().material.color = colorComp.playerColor;
                Destroy(Bullet);
            }

        }
    }
}


ColorRandom

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

public class ColorRandom : MonoBehaviour
{
    private Renderer rend;
    public Color playerColor; //追加

    private void Start()
    {
        rend = GetComponent<Renderer>();
        playerColor = new Color(Random.value, Random.value, Random.value, 1.0f);
        rend.material.color = playerColor;

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

消去条件が良くわかりませんが、Tileにtagを設定しておいて
PaintBalletと同じようにしたら良いのでは?

void OnTriggerExit2D(Collider2D col)
{
    //省略

    if (col.gameObject.tag == "Tile")
    {
    // 消さない

    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/14 10:09

    すみません。Paintに接触していなかったらかPlayerに接触していなかったらDelete()したいのですが、Paintに接触していてもDelete()されます。どこを変えればよいのでしょうか?
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PaintBullets : MonoBehaviour
    {
    public GameObject Tile;
    public ColorRandom currentColor;
    private bool Stay;

    void OnTriggerEnter2d(Collider2D col)
    {
    if (col.gameObject.tag == "Paint")
    {
    Stay = true;
    }
    }
    //弾(bullet)がColliderから離れた時の処理
    void OnTriggerExit2D(Collider2D col)
    {
    if (col.gameObject.tag == "Paint")
    {
    Stay = false;
    }
    if (col.gameObject.tag == "Player")
    {
    if (!Stay)
    {
    Delete();
    }
    }
    }
    void Delete()
    {
    currentColor = GameObject.FindWithTag("Player").GetComponent<ColorRandom>(); ;
    GameObject Tileclone = Instantiate(Tile, this.transform.position, Quaternion.identity);
    Tileclone.GetComponent<Renderer>().material.color = currentColor.playerColor;
    Destroy(this.gameObject);
    }
    }

    キャンセル

  • 2019/12/14 11:02

    if文で&&,||などの複合分岐を使用します。

    https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/if-else

    キャンセル

  • 2019/12/14 16:37

    できました。ですが、たまに思うように動かなかったりするので、できるだけ自分で調べて分からなかったらまた質問します。ありがとうございました。

    修正
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PaintBullets : MonoBehaviour
    {
    public GameObject Tile;
    public ColorRandom currentColor;
    private bool Stay;

    void Start()
    {
    Stay = true;
    }

    //触れるのをやめた時
    void OnTriggerExit2D(Collider2D col)
    {
    if ((col.gameObject.tag == "Player") || (col.gameObject.tag == "Paint"))
    {
    Stay = false;
    }
    }

    //触れている時
    void OnTriggerStay2D(Collider2D col)
    {
    if (col.gameObject.tag == "Paint")
    {
    Stay = true;
    }
    }

    void Update()
    {
    if (!Stay)
    {
    Delete();
    }
    }

    void Delete()
    {
    currentColor = GameObject.FindWithTag("Player").GetComponent<ColorRandom>(); ;
    GameObject Tileclone = Instantiate(Tile, this.transform.position, Quaternion.identity);
    Tileclone.GetComponent<Renderer>().material.color = currentColor.playerColor;
    Destroy(this.gameObject);
    }
    }

    キャンセル

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

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

関連した質問

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