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的也是類似原理