一个对象可能有两个对撞机吗?
我的情况是我有一个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);
}
编辑:此问题已解决
答案 0 :(得分:0)
处理此问题的最佳方法是使一个空的GameObject附加有其他对撞机,同时确保两者都具有一个刚体-选中IsKinematic的孩子。为什么?因为这会将子GameObject与父碰撞结构分开。进一步了解compound colliders。
如果一个GameObject都构成同一个碰撞结构的一部分,则它们中最多应包含一个对撞机。如果它们具有不同的用途,则将不同的GameObject与运动学的刚体结合使用,每个均处理自己的任务。
在您的特定情况下,我将在敌人本身中使用CircleCollider,在具有运动刚体的子GameObject中使用BoxCollider。该子GameObject还可以包含一个脚本,其唯一目的是检查Player并加载BattleScene。