所以我正在用Unity3D制作我的第一个3D视频游戏。我希望具有刚体和胶囊对撞机的玩家游戏对象与环境发生碰撞,即玩家不应该穿过墙壁。我已附加了播放器组件和属性的图像。 玩家有两个对撞机:盒子对撞机和胶囊对撞机。到目前为止,盒对撞机已被禁用,因为如果我激活盒对撞机而不是胶囊对撞机,似乎没有碰撞。除此之外,当前的胶囊对撞机看起来也是如此。 (这是一条穿过播放器模型中心的浅绿色线)
在场景中,玩家旁边有一所房子,玩家应与房子的墙壁碰撞而不是穿过。这房子在下面所示的矩形建筑物的3个侧面上有3个不同的盒子对撞机。图像的远端没有对撞机。 房屋对撞机检查员 重要的是要注意,房屋上没有刚体组件,而是将其设置为静态游戏对象。
以下是上述设置中我谈论的问题的gif。从该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错误,因为奇怪的是,碰撞仅对某些房屋有效,而对其他房屋无效。有时一个盒式对撞机会在所有轴和侧面发生碰撞,有时会出现两个不同的盒式对撞机,有时什么都不起作用,并且只有一个轴会发生碰撞。
答案 0 :(得分:1)