unity自带的是会穿过墙,然后反弹回去进行模拟的。
实现方式主要是依靠射线
下面模拟类似2D圆的物体位移
代码:
public class Move : MonoBehaviour
{
/// <summary>
/// 物体的每秒移动速度
/// </summary>
public Vector3 moveSpeed;
/// <summary>
/// 半径:与将要碰撞物体的距离
/// </summary>
public float radius;
/// <summary>
/// 物体实际的每秒移动速度
/// </summary>
private Vector3 velocity;
/// <summary>
/// 绘制移动预判
/// </summary>
private void OnDrawGizmos()
{
Gizmos.color = Color.green;
Gizmos.DrawLine(transform.position, transform.position + velocity * Time.deltaTime + moveSpeed.normalized * radius);
}
private void FixedUpdate()
{
//获取移动速度
velocity = moveSpeed;
//发射射线检查是否碰到点
//射线发射方向=速度方向
//射程=移动距离+半径
RaycastHit2D rf = Physics2D.Raycast(transform.position, velocity, velocity.magnitude * Time.deltaTime+ radius, LayerMask.GetMask("Ground"));
//碰到后移动速度归零,且移动到(碰撞点处-半径)处
if (rf)
{
transform.position = new Vector3(rf.point.x, rf.point.y, transform.position.z) - radius * moveSpeed.normalized;
velocity = Vector3.zero;
}
else
{
transform.position += velocity * Time.deltaTime;
}
}
}
3D的也是类似原理