Caffeine Inject

研究のこととかUnityのこととか書く

OffMeshLink/NavMeshLinkでJumpさせる

github.com

https://i.gyazo.com/d6c5fc44ffb64b1f322b2ac202c2ce8f.gif

NavMeshComponentsを使う

OffMeshLinkは明示的にジャンプ地点を指定することが難しいと感じます。その点NavMeshLinkは始点と終点をPosition指定で編集できるので便利です。 https://gyazo.com/b3cbee1fbe33f6b10891b4a471671f46 NavMeshComponentsを使うにはUnity-Technologiesの公式リポジトリから引っ張ってきてプロジェクトにコピーしましょう。

github.com

諸々のセットアップ

ブログエントリーを参考に,アニメーションと連動したNavMeshの設定をします。

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

https://gyazo.com/ac53c079dfa42302a9f80217c73b91d0 https://gyazo.com/4378a9a5eb0a3b0e7e91be8833a12d13

ジャンプの挙動を実装する

NavMeshLinkに乗った時にNavMeshを停止させ,DoTweenの機能を使ってNavMeshLinkの終点までtransform.DoMoveします。 ジャンプのアニメーションに合わせてWaitForSecondsを挟み,動きが自然になるよう調節します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using DG.Tweening;

public class NavMeshJump : MonoBehaviour {

    NavMeshAgent agent;
    Animator anim;
    public Transform destination;

    // Use this for initialization
    void Start () {
        agent = GetComponent<NavMeshAgent>();
        anim = GetComponent<Animator>();
        agent.SetDestination(destination.position);
        StartCoroutine(NavMeshRoutine());
    }

    void Update()
    {
        anim.SetFloat("Speed", Vector3.Magnitude(agent.velocity));
    }

    IEnumerator NavMeshRoutine(){
        agent.autoTraverseOffMeshLink = false;

        while (Application.isPlaying){
            yield return new WaitUntil(() => agent.isOnOffMeshLink);

            // OffMeshLink/NavMeshLinkについたらJumpする
            agent.isStopped = true;
            anim.SetTrigger("Jump");
            yield return new WaitForSeconds(0.3f);
            yield return transform.DOMove(agent.currentOffMeshLinkData.endPos, 1.0f, false).WaitForCompletion();
            yield return new WaitForSeconds(0.8f);
            agent.CompleteOffMeshLink();
            agent.isStopped = false;
        }
    }
}

f:id:takumi10194617:20171207165421j:plain