Posted at

OffMeshLink/NavMeshLinkでJumpさせる

More than 1 year has passed since last update.

github.com/AyatsujiTsukasa/NavMeshComponentsSample

https://i.gyazo.com/d6c5fc44ffb64b1f322b2ac202c2ce8f

DoTweenとNavMeshComponentsを使ってNavMeshLinkと連動したJump動作を実装しました


NavMeshComponentsを使う

OffMeshLinkは明示的にジャンプ地点を指定することが難しいと感じます。その点NavMeshLinkは始点と終点をPosition指定で編集できるので便利です。

https://gyazo.com/b3cbee1fbe33f6b10891b4a471671f46

NavMeshComponentsを使うにはUnity-Technologiesの公式リポジトリから引っ張ってきてプロジェクトにコピーしましょう。

github.com/Unity-Technologies/NavMeshComponents


諸々のセットアップ

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

【Unity】変化する地形で、マップから落ちないように移動させる手っ取り早い方法

NavmeshのAI経路探索とAnimatorのアニメーションを連動させる

https://gyazo.com/ac53c079dfa42302a9f80217c73b91d0

https://gyazo.com/4378a9a5eb0a3b0e7e91be8833a12d13


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

NavMeshLinkに乗った時にNavMeshを停止させ,DoTweenの機能を使ってNavMeshLinkの終点までtransform.DoMoveします。

ジャンプのアニメーションに合わせてWaitForSecondsを挟み,動きが自然になるよう調節します。


NavMeshJump.cs


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;
}
}
}