- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个可以将玩家从一端带到另一端的门户。所以,如果玩家有 50% 从一端进入门户,他的另外 50% 将从另一端伸出。
我正在使用具有完全相同组件的完全相同 Sprite 的两个预制角色。门户网站将只使用这两个预制角色,而不是证实新的克隆。
澄清一下,我使用 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/
jQuery 提供了一个 isTrigger 属性,它允许我们知道该事件是“真实事件”还是只是“已触发”。 $(ele).on("click", function(e){ if(e.isTri
我正在尝试创建一个可以将玩家从一端带到另一端的门户。所以,如果玩家有 50% 从一端进入门户,他的另外 50% 将从另一端伸出。 我正在使用具有完全相同组件的完全相同 Sprite 的两个预制角色。门
我在我正在处理的一些 JS 代码中遇到了这个问题: if ( typeof( e.isTrigger ) == 'undefined' ) { // do some stuff
我是一名优秀的程序员,十分优秀!