天天看點

【Unity3D】分裂平面的跳躍與自動尋路

《【Unity3D】自動尋路》(點選打開連結)中還有很多值得深究的地方,雖然在《【Unity3D】自動尋路的跳躍》(點選打開連結)已經實作在自動尋路中的跳躍,但同時也帶來了一個問題,如何在分裂平面中進行跳躍?同時跳躍完畢還是可以自動尋路的?下面繼續舉一個例子說明這個問題:

【Unity3D】分裂平面的跳躍與自動尋路

如圖所示,設定兩個分裂的Plane,小球Sphere能夠在它們之間以跳躍的方式越過。

制作過程如下:

一、場景布置

1、拖出兩個Plane,1個Sphere、1個Directional Light,再設定一些材質,與改下主錄影機的屬性,具體如下圖所示:

【Unity3D】分裂平面的跳躍與自動尋路

2、之後,儲存目前的場景,設定自動尋路的時候,将OffMeshLink Generatic勾上,再設定一定距離Jump Distance,而不是預設的0,再進行烘培Bake。

【Unity3D】分裂平面的跳躍與自動尋路

烘焙之後,你應該看到如下的景象,Unity3D顯然對這個問題已經考慮到,給我們算出一系列可行的跳躍點。

【Unity3D】分裂平面的跳躍與自動尋路

3、對小球上Nav Mesh Agent和Rigidbody屬性,将小球的Auto Traverse Off Mesh...取消掉。

【Unity3D】分裂平面的跳躍與自動尋路

二、腳本編寫

對小球賦予Navigation.cs則大功告成:

using UnityEngine;
using System.Collections;

public class Navigation : MonoBehaviour
{

    private NavMeshAgent navMeshAgent;
    private bool is_jumping;

    void Start()
    {
        navMeshAgent = gameObject.GetComponent<NavMeshAgent>();//初始化navMeshAgent 
        is_jumping = false;//是否正在跳躍的flag
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0) && !is_jumping)
        {//如果不是在跳躍、不是到達自動尋路邊緣,按下滑鼠左鍵     
            //自動尋路  
            Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit mHit;
            if (Physics.Raycast(mRay, out mHit))
            {
                if (mHit.collider.gameObject.name == "Plane")//如果點的是Plane上的一點  
                {
                    navMeshAgent.SetDestination(mHit.point);
                }
            }
        }
        if (navMeshAgent.isOnOffMeshLink)//如果小球到達跳躍邊緣
        {
            OffMeshLinkData offMeshLinkData = navMeshAgent.currentOffMeshLinkData;
            transform.LookAt(offMeshLinkData.endPos);//面朝跳躍的結束點
            navMeshAgent.enabled = false;//關閉自動尋路  
            is_jumping = true;
            this.rigidbody.velocity = new Vector3(offMeshLinkData.endPos.x * 3, 5, offMeshLinkData.endPos.z);
        }
        if (this.transform.position.y < -3)
        {//如果小球跳躍的時候沒跳到Plane上面
            Application.LoadLevel("Navmesh_diferent_plane_jump");
        }
    }

    //如果跳躍之中的小球和Plane開始碰撞  
    void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.gameObject.name == "Plane" && is_jumping)
        {
            is_jumping = false;
            navMeshAgent.enabled = true;//重新打開自動尋路  
        }
    }

}
           

這裡自動尋路和《【Unity3D】自動尋路》( 點選打開連結)一樣,然後由于Unity3D的自動尋路是鎖死Y軸,是以套路還是和《【Unity3D】自動尋路的跳躍》( 點選打開連結)一樣,在小球需要跳躍的時候,需要關閉自動尋路,使剛體真正地生效。同時,你還要設定一個正在跳躍的Flag,除了落地的時候,進行碰撞檢測的需要以外,還有避免使用者在小球跳躍的過程之中,還在瘋狂點闆要求自動尋路,導緻關閉自動尋路之後的找不到對象的報錯。

這裡唯一不同的是,我們在這裡利用到OffMeshLink,一旦使用者來到這個跳躍點,也就是OffMeshLink之中,則直接對其施加一個往跳躍結束點的3倍X的速度,5機關的Y速度,跳躍結束點的Z速度。這裡我的Z速度不設定為3倍原因,是因為我這兩個闆,是沿X方向擺的,避免老往Z軸跳躍得過多,導緻小球經常跳出兩個闆。

當然這也就是涉及到遊戲優化問題,如何讓玩家的操作和他們所想的更貼近,一直是個嚴重的難題。這個自動尋路和跳躍做是做出來了,但在優化方面估計還要寫很多代碼,以使它們更加平滑。

繼續閱讀