C# 使用游戏对象在Unity 3D上拖动时与BoxCollider 2D碰撞时如何检测碰撞

C# 使用游戏对象在Unity 3D上拖动时与BoxCollider 2D碰撞时如何检测碰撞,c#,unity3d,C#,Unity3d,我创建了一个简单的拖动脚本。这将是我游戏的主要输入,这就是我控制玩家的方式。脚本如下所示: public void OnMouseDown() { offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); if (gameController

我创建了一个简单的拖动脚本。这将是我游戏的主要输入,这就是我控制玩家的方式。脚本如下所示:

public void OnMouseDown() {
    offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));

    if (gameController.GetCurrentState () != GameStates.INGAME){
        gameController.StartGame();
    }
}

public void OnMouseDrag() {
    if (gameController.GetCurrentState () == GameStates.INGAME) {
        Vector3 curScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint (curScreenPoint) + offset;
        transform.position = curPosition;
    }
}
此脚本已附加到我的播放机。我的播放器还附带了一个刚体2D和圆形碰撞器2D。我已经创建了一些墙,在游戏开始时,我正在使用mainCam.ScreenToWorldPoint将其重新定位到相机外部。这是通过以下方式完成的:

var mainCam : Camera;

var topWall : BoxCollider2D;
var bottomWall : BoxCollider2D;
var leftWall : BoxCollider2D;
var rightWall : BoxCollider2D;

//Reference the players

function Start () {

    //Move each wall to its edge location:
    topWall.size = new Vector2 (mainCam.ScreenToWorldPoint (new Vector3 (Screen.width * 2f, 0f, 0f)).x, 1f);
    topWall.center = new Vector2 (0f, mainCam.ScreenToWorldPoint (new Vector3 ( 0f, Screen.height, 0f)).y + 0.5f);

    bottomWall.size = new Vector2 (mainCam.ScreenToWorldPoint (new Vector3 (Screen.width * 2, 0f, 0f)).x, 1f);
    bottomWall.center = new Vector2 (0f, mainCam.ScreenToWorldPoint (new Vector3( 0f, 0f, 0f)).y - 0.5f);

    leftWall.size = new Vector2(1f, mainCam.ScreenToWorldPoint(new Vector3(0f, Screen.height*2f, 0f)).y);;
    leftWall.center = new Vector2(mainCam.ScreenToWorldPoint(new Vector3(0f, 0f, 0f)).x - 0.5f, 0f);

    rightWall.size = new Vector2(1f, mainCam.ScreenToWorldPoint(new Vector3(0f, Screen.height*2f, 0f)).y);
    rightWall.center = new Vector2(mainCam.ScreenToWorldPoint(new Vector3(Screen.width, 0f, 0f)).x + 0.5f, 0f);
}
与播放器一样,此墙也附着有刚体2D和长方体碰撞器2D。我的问题是我无法检测到任何类型的碰撞。即使我把球拖到墙上也不行。我使用此脚本的目的是检测您在拖动时是否触摸了墙壁。通过这样做,我将能够调用我的游戏状态“GameOver”并结束游戏


你知道为什么我不能检测到这种碰撞吗?我确信墙壁的位置正确,球确实碰到了墙壁。

你没有写下你是如何制作screenPoint的,所以这里是如何以防万一的

public void OnMouseDown() {
    screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);

你是在问如何检测碰撞吗?确保所有对象(墙和播放器对象)都有碰撞的R2D组件。在这些对撞机上,将IsTrigger设置为true。然后在您的播放器控制器中:

void OnTriggerEnter2D(Collider2D other) {
    // check if "other" is a wall
    if (other.transform.GetComponent<Wall>()) 
        this.gameState = GameStates.GAMEOVER;
}
void OnTriggerInter2d(碰撞的R2D其他){
//检查“其他”是否为墙
if(other.transform.GetComponent())
this.gameState=GameStates.GAMEOVER;
}

请注意,至少在一个可碰撞的游戏对象上需要RigidBody2D。只需在所有物体上放置刚体2D,不要使用重力。

正如我在问题上所说的,碰撞对我不起作用,因为刚体或碰撞2D只是检测碰撞,但使用我的拖动脚本,它们实际上不会碰撞。不过,你没有显示检测碰撞的位置。它们绝对应该碰撞。如果没有收到碰撞,则需要从这里开始。