gpt4 book ai didi

c# - Unity 在没有 IsTrigger 的情况下使用 OnCollisionEnter2D 检测碰撞

转载 作者:行者123 更新时间:2023-11-30 17:28:14 25 4
gpt4 key购买 nike

我正在尝试创建一个可以将玩家从一端带到另一端的门户。所以,如果玩家有 50% 从一端进入门户,他的另外 50% 将从另一端伸出。

我正在使用具有完全相同组件的完全相同 Sprite 的两个预制角色。门户网站将只使用这两个预制角色,而不是证实新的克隆。

下图描述了我试图用碰撞盒移动它们的方法: Explanation

澄清一下,我使用 OnCollisionEnter2D 检测接触点以确定玩家从门户的哪一侧进入。如上图右侧所示,“进来的人”应该可以随时折返不被移走,而从另一边离开时仍然可以被移走。

但是,我的代码面临的问题是 OnCollisionEnter2D 函数仅在 IsTrigger 为 false 时才起作用。但是当 IsTrigger 为假时,我的角色无法通过传送门并被推到地上并从 map 上掉下来。

我尝试使用 Physics2D.IgnoreCollision,但它似乎没有效果。

进入导出的第二个角色被推了出去,而不是平稳过渡。

public Transform PortalExit;
public CharacterController2D Player;

private GameObject Player1;
private CharacterController2D Player1Controller;
private Vector2 Player1Position;
private GameObject Player2;
private CharacterController2D Player2Controller;
private Vector2 Player2Position;

// Use this for initialization
void Start () {
Player1 = GameObject.FindWithTag("Player1");
Player1Controller = GameObject.FindWithTag("Player1").GetComponent<CharacterController2D>();
Player1Position = Player1.transform.position;
Player2 = GameObject.FindWithTag("Player2");
Player2Controller = GameObject.FindWithTag("Player2").GetComponent<CharacterController2D>();
Player2Position = Player2.transform.position;
}

// Update is called once per frame
void Update () {

}

void OnCollisionEnter2D (Collision2D collision) {

Collider2D collider = collision.collider;

if (collider.gameObject.tag == "Player1") {

Vector3 contactPoint = collision.contacts[0].point;
Vector3 center = collider.bounds.center;

bool right = contactPoint.x > center.x;
bool top = contactPoint.y > center.y;

if (right) {
// Physics2D.IgnoreCollision(GameObject.FindWithTag("Player1").GetComponent<Collider2D>(), GetComponent<Collider2D>());

// change Player2's position into the other portal
print("Hello!");
Player2Position.x = 1.6f;
Player2Position.y = PortalExit.position.y;
Player2.transform.position = Player2Position;
}

if (!right) {
print("Goodbye!");
// puts Player1 into the detention center
Player1Position.x = -5.55f;
Player1Position.y = -6f;

Player1.transform.position = Player1Position;
}

}

if (collider.gameObject.tag == "Player2") {

Vector3 contactPoint = collision.contacts[0].point;
Vector3 center = collider.bounds.center;

bool right = contactPoint.x > center.x;
bool top = contactPoint.y > center.y;

if (!right) {
// change Player2's position into the other portal
Player1Position.x = -3.6f;
Player1Position.y = PortalExit.position.y;
Player1.transform.position = Player1Position;
}

if (right) {
// puts Player1 into the detention center
Player2Position.x = -5.55f;
Player2Position.y = -6f;

Player2.transform.position = Player2Position;
}

}
}

最佳答案

你有两个选择:

1。将 isTrigger 更改为 false,然后从编辑器或通过脚本将 Rigidbody2D 主体类型从 Dynamic 更改为 Kinematic:

rb2d.bodyType = RigidbodyType2D.Kinematic;

通过这样做,刚体将停止对重力或来自其他物体的力作出 react 。然后,您可以使用 OnCollisionEnter2D 检测碰撞事件,而不会出现问题中描述的问题。


2。将 isTrigger 更改为 true,将 Rigidbody2D Gravity Scale 设置为 0,这样它就不会穿过地面。现在,您可以使用 OnTriggerEnter2D 检测触发器并使用 Physics2D.Raycast 伪造检测点,因为 OnTriggerEnter2D 无法提供碰撞点:

void OnTriggerEnter2D(Collider2D collision)
{
//Calculate layermask that excludes this GameObject we are raycasting from
int layerMask = ~(1 << gameObject.layer);

float distance = 100f;

// Cast a ray straight down.
RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.forward, distance, layerMask);

if (hit.collider != null)
{
Collider2D collider = hit.collider;

Vector3 contactPoint = hit.point;
Vector3 center = collider.bounds.center;


//...........
}
}

我建议您都尝试一下,看看您最喜欢哪一个。

关于c# - Unity 在没有 IsTrigger 的情况下使用 OnCollisionEnter2D 检测碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53165867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com