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

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