我可以将两个对撞机附加到我的敌人身上,分别做不同的事情吗?

时间:2018-12-31 22:13:29

标签: unity3d triggers collision

一个对象可能有两个对撞机吗?

我的情况是我有一个CircleCollider2D,当敌人进入时,它会导致我的敌人追赶玩家。效果很好,但是我还想拥有一个BoxCollider2D,当玩家进入游戏时,它将切换到我的场景“ BattleScene”。

我想要这样,以便当我的玩家进入圆形对撞机时,我的敌人会跟随他,但是当玩家靠近并进入盒子对撞机(均与敌人连接)时,它将场景切换到名为“ BattleScene”的场景。
我想到的另一个选择是使用刚体碰撞,但是我不知道如何实现。

这是我的代码

private bool checkContact;
private bool checkTrigger;
public float MoveSpeed;
public Transform target;
public Animator anim;
public Rigidbody2D myRigidBody;
BoxCollider2D boxCollider;
public string levelToLoad;
// Start is called before the first frame update
void Start()
{
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();//getting the position of our player

    anim = GetComponent<Animator>();
    myRigidBody = GetComponent<Rigidbody2D>();
    boxCollider = gameObject.GetComponent<BoxCollider2D>();
}

// Update is called once per frame
void Update()
{
    if (checkTrigger == true)
    {

        transform.position = Vector2.MoveTowards(transform.position, target.position, MoveSpeed * Time.deltaTime); //move towrds from your position to the position of the player 
        if (myRigidBody.position.y < target.position.y && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x)) //if it is  further away from target in x direction than y direction the animation for moving in y is loaded and vice versa
        {
            anim.SetFloat("MoveY", 1); 
            anim.SetFloat("MoveX", 0);
        }
        if (myRigidBody.position.y > target.position.y && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x))
        {
            anim.SetFloat("MoveY", -1);
            anim.SetFloat("MoveX", 0);
        }
        if (myRigidBody.position.x > target.position.x && Mathf.Abs(target.position.y - myRigidBody.position.y) < Mathf.Abs(target.position.x - myRigidBody.position.x))
        {
            anim.SetFloat("MoveX", -1);
            anim.SetFloat("MoveY", 0);
        }
         if (myRigidBody.position.x < target.position.x && Mathf.Abs(target.position.y -myRigidBody.position.y)  < Mathf.Abs(target.position.x - myRigidBody.position.x))
        {
            anim.SetFloat("MoveX", 1);
            anim.SetFloat("MoveY", 0);
        }

        anim.SetBool("checkTrigger", checkTrigger); //updating if in range

    }


}
public void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.name == "Player")
    {
        checkTrigger = true; //setting our check trigger = true so it will follow if in radius
        anim.SetBool("checkTrigger", checkTrigger);
    }


}


public void OnTriggerExit2D(Collider2D other)
{
    if (other.gameObject.name == "Player")
    {
        checkTrigger = false; //setting our check trigger = false so it will not follow if not in radius
        anim.SetBool("checkTrigger", checkTrigger);
    }

编辑:此问题已解决

1 个答案:

答案 0 :(得分:0)

处理此问题的最佳方法是使一个空的GameObject附加有其他对撞机,同时确保两者都具有一个刚体-选中IsKinematic的孩子。为什么?因为这会将子GameObject与父碰撞结构分开。进一步了解compound colliders

如果一个GameObject都构成同一个碰撞结构的一部分,则它们中最多应包含一个对撞机。如果它们具有不同的用途,则将不同的GameObject与运动学的刚体结合使用,每个均处理自己的任务。

在您的特定情况下,我将在敌人本身中使用CircleCollider,在具有运动刚体的子GameObject中使用BoxCollider。该子GameObject还可以包含一个脚本,其唯一目的是检查Player并加载BattleScene。