U3D Rigidbody_2_属性篇_04_collisionDelectionMode

让人想犯罪 __ 提交于 2020-01-25 18:17:22

collisionDelectionMode

刚体的碰撞检测模式。

用于设置刚体以进行连续碰撞检测,可避免快速移动的对象在未检测到碰撞的情况下穿过其他对象。为获得最佳效果,对于快速移动的对象,请将该值设置为 CollisionDetectionMode.ContinuousDynamic ;对于需要与之碰撞的其他对象,将该值设置为 CollisionDetectionMode.Continuous 。

这对物理性能有很大的影响,因此如果快速飞行的对象的碰撞没有任何问题,请保持默认设置,即:CollisionDetectionMode.Discrete。

连续碰撞检测仅支持带有球体、胶囊体或盒形碰撞体的刚体。

[1]创建子弹,当子弹被创建时候,会被施加一个力,朝着这个力的方向飞去。该方向是摄像机的朝向。关于跟随摄像机的制作,请参考之前的博客内容。MMO_2_功能开发阶段_2_相机的控制(版本_V1.0)
为了方便观察,将子弹的材质设置为红色,且Rigidbody的参数如下图
在这里插入图片描述
子弹上的脚本如下:

using UnityEngine;
public class Bullet : MonoBehaviour
{
    public Rigidbody rigidbody;
    public float Power;
    private Vector3 dir;     

    void Start()
    {
        AddForce();
    }

    void Update()
    {

    }

    public void SetDir(Vector3 vector)
    {
        dir = vector;       
    }

    private void AddForce()
    {
        rigidbody.AddForce(dir * Power);
    }
}

—分割线—

[2]创建胶囊体,为其添加控制移动的脚本:PlayerCtrl.cs。为其添加当按下 空格 键时创建子弹,并且设置子弹的飞行朝向的脚本:RigibodyMethodsCtrl.cs。

using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    private float m_MoveSpeed;//移动速度
    private float m_RotateSpeed;//旋转速度
    private Vector3 m_Input;//输入
    private Vector3 m_Dir;//输入单位方向

    private void Start()
    {
        m_MoveSpeed = 5.0f;
        m_RotateSpeed = 5.0f;
    }

    private void Update()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
        m_Input.Set(x, 0.0f, z);

        if (m_Input.magnitude > 0.1f)
        {
            m_Dir = CameraCtrl.Instance.CameraRotationY.localRotation * m_Input;
            m_Dir.Normalize();

            Rotate();
            Move();
        }
    }

    private void Rotate()
    {
        transform.forward = Vector3.Lerp(transform.forward, m_Dir, Time.deltaTime * m_RotateSpeed);
    }

    private void Move()
    {
        transform.position = transform.position + m_Dir * Time.deltaTime * m_MoveSpeed;
        
    }
}

using UnityEngine;

public class RigibodyMethodsCtrl : MonoBehaviour
{
    public GameObject bulletObj;
    public Transform spawnPoint;

    private void Awake()
    {
    }

    private void Start()
    {
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CreateBullet();
        }
    }

    private void CreateBullet()
    {
        //创建
        GameObject obj = GameObject.Instantiate(bulletObj, spawnPoint.position, spawnPoint.rotation);       

        //设置子弹飞向的方向
        Bullet bullet = obj.GetComponent<Bullet>();
        if (bullet == null)
        {
            bullet = obj.AddComponent<Bullet>();
        }

        bullet.SetDir(CameraCtrl.Instance.CameraRotationY.forward);

        //指定时间销毁
        GameObject.Destroy(obj, 10.0f);
    }
}

—分割线—

[3]运行结果:
在这里插入图片描述
—分割线—

[4]若将Bullet的Power的值设置为5000
在这里插入图片描述
在这里插入图片描述
—分割线—

[5]为了解决这种情况,应当将Bullet子弹的Rigidbody组件的CollisionDetection属性设置为:ContinuousDynamic。并且将墙的Rigidbody组件的CollisionDetection属性设置为:Continuous。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!