因此,我正在用Unity3D制作我的第一个3D视频游戏。我希望这个带有刚体和胶囊对撞机的玩家游戏对象能与周围环境发生碰撞,即玩家不应该撞穿墙壁。我已经附加了播放器的组件和属性的图像。
玩家有两个对撞器:长方体对撞器和胶囊对撞器。盒子对撞机现在是禁用的,因为如果我激活盒子对撞机而不是胶囊对撞机,似乎没有碰撞。除此之外,目前的胶囊对撞机看起来是这样的。
(它是通过播放器模型中心的一条浅绿色线条)
在场景中,玩家旁边有一座房子,玩家应该与房子的墙壁相撞,而不是通过剪裁。房子有3个不同的盒子对撞机在长方形建筑的3个侧面显示如下所示。在图像的远侧没有碰撞器。
房子上的盒子对撞机的检查员
重要的是要注意,房子上没有刚体组件,它被设置为静态游戏对象。
下面是我使用上述设置讨论的问题的gif。从这张图可以看出,房子的z轴(两边)上有碰撞,但在x轴上绝对没有任何东西,因为我能够穿过房子并移动到里面。
最初,我认为主玩家游戏对象的胶囊对撞机的半径为0可能是问题所在,但是似乎只有半径设置为0的情况下才会发生碰撞(至少在下面附加的碰撞脚本中是这样)。因此,我将半径增加到包含整个播放器对象的位置。这是一张包含对撞机检查器属性的图像。
这是播放模式下的gif。从gif中,以前存在的任何碰撞都被完全移除,玩家现在可以在所有方向上裁剪。
在这一点上,我认为这可能是因为我在房子里有3个不同的盒子对撞机,只用1个就可以解决这个问题。结果,我把房子的盒子对撞机改成这样:
即使有了这个房子盒子对撞机,玩家也可以用胶囊对撞机的两种设置(0半径和包围玩家身体的半径)穿过房子的所有侧面。
盒子对撞机也产生了同样的结果。
下面是我的碰撞脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class collision : MonoBehaviour
{
public bool sendTriggerMessage = false;
public LayerMask layerMask = -1; //make sure we aren't in this layer
public float skinWidth = 0.1f; //probably doesn't need to be changed
private float minimumExtent;
private float partialExtent;
private float sqrMinimumExtent;
private Vector3 previousPosition;
private Rigidbody myRigidbody;
private Collider myCollider;
//initialize values
void Start()
{
myRigidbody = GetComponent<Rigidbody>();
myCollider = GetComponent<Collider>();
previousPosition = myRigidbody.position;
minimumExtent = Mathf.Min(Mathf.Min(myCollider.bounds.extents.x, myCollider.bounds.extents.y), myCollider.bounds.extents.z);
partialExtent = minimumExtent * (1.0f - skinWidth);
sqrMinimumExtent = minimumExtent * minimumExtent;
}
void FixedUpdate()
{
//have we moved more than our minimum extent?
Vector3 movementThisStep = myRigidbody.position - previousPosition;
float movementSqrMagnitude = movementThisStep.sqrMagnitude;
if (movementSqrMagnitude > sqrMinimumExtent)
{
float movementMagnitude = Mathf.Sqrt(movementSqrMagnitude);
RaycastHit hitInfo;
//check for obstructions we might have missed
if (Physics.Raycast(previousPosition, movementThisStep, out hitInfo, movementMagnitude, layerMask.value))
{
if (!hitInfo.collider)
return;
if (hitInfo.collider.isTrigger)
hitInfo.collider.SendMessage("OnTriggerEnter", myCollider);
if (!hitInfo.collider.isTrigger)
myRigidbody.position = hitInfo.point - (movementThisStep / movementMagnitude) * partialExtent;
}
}
previousPosition = myRigidbody.position;
}
}
我正在使用这个free animation pack来给播放器添加动画。
我不确定这是否是Unity bug,因为奇怪的是,碰撞只适用于某些房子,而不适用于其他房子。有时,所有的轴和边都会发生碰撞,只有一个盒子对撞机,有时两个不同的盒子碰撞机,有时什么都不起作用,只有一个轴上有碰撞。
发布于 2019-06-27 19:23:51
[IsKinematic](https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html)“控制物理是否影响刚体。
如果启用了isKinematic,力、碰撞或关节将不再影响刚体...“
在RigidBody中取消选择该选项,对撞机将正常工作。
https://stackoverflow.com/questions/56795721
复制