团结 - 三面碰撞

时间:2016-05-31 18:38:40

标签: c# collision-detection unity5 unity3d-2dtools

我遇到碰撞问题。有时候它可以正常工作,但是当我在红色物体内部移动蓝色物体时,碰撞会发生变化并且效果不佳。例如,我添加了ZIP文件:here

生成器脚本:

public class Generator : MonoBehaviour
{
    public GameObject obstaclePrefab;
    Dictionary<string, GameObject> obstacles;
    Dictionary<string, Quaternion> rotations;     // default rotation = open to the left

void Start()
{
    rotations = new Dictionary<string, Quaternion>()
    {
        { "left", Quaternion.Euler(0,0,0) },
        { "down", Quaternion.Euler(0,0,90) },
        { "right", Quaternion.Euler(0,180,0) },
        { "up", Quaternion.Euler(0,0,270) }
    };
    obstacles = new Dictionary<string, GameObject>();
    SpawnObstacle(new Vector2(3,0),"left");
}

void SpawnObstacle(Vector2 position, string openSide)
{
    //TODO
    print("SpawnObstacle()");
    GameObject go = (GameObject)Instantiate(obstaclePrefab, position, rotations[openSide]);
    go.GetComponent<Obstacle>().openSide = openSide;
    string pos = position.x + "_" + position.y;
    obstacles.Add(pos, go);
}

public GameObject GetObjectAt(Vector3 position)
{
    string pos = position.x + "_" + position.y;
    if (obstacles.ContainsKey(pos) == true)
    {
        print(obstacles[pos]);
        return obstacles[pos];
    }

    else return null;
}
}

PlayerMove脚本:

public class PlayerMove : MonoBehaviour
{

public Generator generator;
Vector3 pos;
public float speed;


void Start()
{
    pos = transform.position;
}

void Update()
{

    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        GameObject go = generator.GetObjectAt(transform.position - new Vector3(speed, 0, 0));
        if (go == null || go.GetComponent<Obstacle>().canEnterFromSide("left"))
        {
            print(go);

            pos.x -= speed;
        }
    }

    else if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        GameObject go = generator.GetObjectAt(transform.position + new Vector3(speed, 0, 0));
        if (go == null || go.GetComponent<Obstacle>().canEnterFromSide("right"))
        {
            print(go);

            pos.x += speed;
        }
    }

    else if (Input.GetKeyDown(KeyCode.UpArrow))
    {
        GameObject go = generator.GetObjectAt(transform.position + new Vector3(0, speed, 0));
        if (go == null || go.GetComponent<Obstacle>().canEnterFromSide("up"))
        {
            print(go);

            pos.y += speed;
        }
    }

    else if (Input.GetKeyDown(KeyCode.DownArrow))
    {
        GameObject go = generator.GetObjectAt(transform.position - new Vector3(0, speed, 0));
        if (go == null || go.GetComponent<Obstacle>().canEnterFromSide("down"))
        {
            print(go);

            pos.y -= speed;
        }
    }

    transform.position = Vector2.MoveTowards(transform.position, pos, speed);

}


void OnTriggerEnter2D(Collider2D col)
{

    if (col.CompareTag("obstacle"))
    {
        col.gameObject.GetComponent<Obstacle>().Move(true);
        print("obstacle");
    }

   /* else if (col.transform.root.GetComponent<Obstacle>().openSide == "left")
    {

    }*/
}


}

障碍脚本:

public class Obstacle : MonoBehaviour {

Vector3 pos;
GameObject player;
bool move = false;
public string openSide;

void Start () {
    player = GameObject.FindWithTag("Player");
    pos = transform.position;
}

public bool Move(bool mo)
{
    if(mo)
        move = true; 
    return move;
}

void Update () {

    if (openSide == "left" && Input.GetKeyDown(KeyCode.LeftArrow))
        move = false;

    if (openSide == "right" && Input.GetKeyDown(KeyCode.RightArrow))
        move = false;

    if (openSide == "up" && Input.GetKeyDown(KeyCode.UpArrow))
        move = false;

    if (openSide == "down" && Input.GetKeyDown(KeyCode.DownArrow))
        move = false;

    if (move)
        transform.position = player.transform.position;

}

public bool canEnterFromSide(string side)
{
    return side == openSide;
}

}

0 个答案:

没有答案