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。
来源:CSDN
作者:Dean272727
链接:https://blog.csdn.net/Dean272727/article/details/103872786