盒子对撞机未记录玩家所有轴上的碰撞

时间:2019-06-27 17:01:41

标签: c# unity3d

所以我正在用Unity3D制作我的第一个3D视频游戏。我希望具有刚体和胶囊对撞机的玩家游戏对象与环境发生碰撞,即玩家不应该穿过墙壁。我已附加了播放器组件和属性的图像。 properties image 1 properties image 2(continued) properties image 3(final) 玩家有两个对撞机:盒子对撞机和胶囊对撞机。到目前为止,盒对撞机已被禁用,因为如果我激活盒对撞机而不是胶囊对撞机,似乎没有碰撞。除此之外,当前的胶囊对撞机看起来也是如此。 capsule collider(这是一条穿过播放器模型中心的浅绿色线)

在场景中,玩家旁边有一所房子,玩家应与房子的墙壁碰撞而不是穿过。这房子在下面所示的矩形建筑物的3个侧面上有3个不同的盒子对撞机。图像的远端没有对撞机。 box collider on house initial set up 房屋对撞机检查员 inspector for house box collider 重要的是要注意,房屋上没有刚体组件,而是将其设置为静态游戏对象。

以下是上述设置中我谈论的问题的gif。从该gif可以看出,房子的z轴(两侧)都发生了碰撞,但是x轴上绝对没有任何碰撞,因为我能够穿过房子并向内移动。

最初,我认为可能是主要玩家游戏对象的胶囊碰撞器的半径为0的事实,但是似乎只有将半径设置为0时才发生冲突(至少与我正在使用的碰撞脚本关联)下面)。结果,我将半径增加到包含整个玩家对象的半径。这是同时包含对撞机检查器属性的图像。 capsule collider with increased radius 这是处于播放模式的gif。从gif中可以完全消除以前存在的任何碰撞,并且播放器现在可以在所有侧面进行剪切。

在这一点上,我认为可能是因为我在房屋上使用了3个不同的盒式对撞机,而仅使用1个就可以解决问题。结果,我将房屋的对撞机更改为如下所示: house with only 1 box collider 即使使用这种房屋盒对撞机,玩家也可以使用胶囊对撞机的两种设置(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错误,因为奇怪的是,碰撞仅对某些房屋有效,而对其他房屋无效。有时一个盒式对撞机会在所有轴和侧面发生碰撞,有时会出现两个不同的盒式对撞机,有时什么都不起作用,并且只有一个轴会发生碰撞。

1 个答案:

答案 0 :(得分:1)

<IsKinematic> “控制物理学是否会影响刚体。

如果启用了isKinematic,则力,碰撞或关节将不再影响刚体...”

取消选择RigidBody中的对撞机将起作用。