关于unity物体移动穿墙问题。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章