0

これはばかげた質問に聞こえるかもしれませんが、if ステートメントで、オブジェクトが現在別のオブジェクトと衝突しているかどうかを確認することは可能ですか?

これは私が最初に考えたものです (以下のコード スニピットで) が、私が理解できない奇妙な理由により、オブジェクトがプラットフォームによって上方にプッシュされている場合、変数 onFloor が false になることがあります。

void OnCollisionEnter2D(Collision2D c)
{
    switch(c.gameObject.tag)
    {
        case "Platform":
            onFloor = true;
            break;
        default:
            break;
    }
}

void OnCollisionExit2D(Collision2D c)
{
    switch(c.gameObject.tag)
    {
        case "Platform":
            onFloor = false;
            break;
        default:
            break;
    }
}

そのため、コード内でオブジェクトのサークルコライダーが交差するオブジェクトのボックスコライダーと衝突しているかどうかを検出する方法があるかどうかを尋ねています。何かのようなもの

if(CircleCollider2D.CollidingObject != null && CircleCollider2D.CollidingObject.tag == "Platform")
{ /*Code I'd like to do here*/ }

これは、うまくいく方法を考えようとしている私の想像にすぎませんが、要点はわかります。

それで、私は尋ねます、私の想像力に対する解決策はありますか?

プログラマーと話し合った後、IsTouching に下線が引かれ、次のエラーが表示されます: 'Collider2D' には 'IsTouching' の定義が含まれていません。ディレクティブまたはアセンブリ参照?)。

スリム化されたコードは次のとおりです。

using UnityEngine;

public class Ball : MonoBehaviour
{ 
    Vector2 jumpVelocity;
    public Collision2D platform;

    // Use this for initialization
    void Start()
    {
        jumpVelocity = new Vector2(0, rigidbody2D.gravityScale * 100);
    }

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Space) && collider2D.IsTouching(platform))
        {
            rigidbody2D.AddForce(jumpVelocity, ForceMode2D.Force);
        }
    }
}

collider2D を Collision2D 変数に変更し、その variable.collider.IsTouching を使用しても同じエラーが発生することに注意してください。

4

2 に答える 2

3

とは異なる解決策がありますかOnCollisionEnter2D

はい。それらの多く!

CircleCollider2D、他の 2D コライダーとその基本クラスCollision2Dには、これを行うための関数が組み込まれています。

public bool IsTouching(Collider2D collider); //Check collision by the provided collider
public bool IsTouchingLayers(); //Check collision by any collision
public bool IsTouchingLayers(int layerMask); //Check collision by layer
public bool OverlapPoint(Vector2 point); //Check collision by position

これには、最初の関数の方が適しています。

簡単な例:

Collision2D collider1;
Collision2D collider2;

void Update()
{
    //Checks if collider1 is touching with collider2
    if (collider1.collider.IsTouching(collider2.collider))
    {

    }
}

関数の例OnCollisionEnter2D:

public CircleCollider2D myCircleCollider;

void OnCollisionEnter2D(Collision2D c)
{
    if (c.collider.IsTouching(myCircleCollider))
    {

    }
}
于 2016-10-06T13:58:36.553 に答える
0

おそらく、あなたが探しているのは OnCollisionStay メソッドです。これは、互いに接触している限り発火します。

ここのリンクに詳細情報があります: https://docs.unity3d.com/ScriptReference/Collider2D.OnCollisionStay2D.html

于 2016-10-06T13:51:04.370 に答える