예제 #1
0
    private IEnumerator Climb()
    {
        onClimbStart.Invoke();

        var link = agent.currentOffMeshLinkData;
        var fwd  = link.offMeshLink.endTransform.forward;
        var btm  = link.offMeshLink.endTransform.position;
        var p1   = new Vector3(btm.x, link.startPos.y, btm.z);
        var p2   = new Vector3(btm.x, link.endPos.y, btm.z);

        if (p2.y - p1.y < 0f)   // 降りる時: 近寄る→ジャンプで飛びつかみ→降りる
        {
            yield return(CloseTo(link.startPos, 0.4f));

            yield return(JumpTo(p1, fwd));

            agent.isStopped = true; // エージェント処理停止
            yield return(ClimbOrDescend(p1, p2, fwd));
        }
        else                        // 登る時:近寄る→登る→ジャンプで飛び降り
        {
            agent.isStopped = true; // エージェント処理停止
            yield return(CloseTo(p1, 0.3f));

            yield return(ClimbOrDescend(p1, p2, fwd));

            yield return(JumpTo(link.endPos, fwd));
        }

        // オフメッシュリンク移動終了+エージェント処理再開。
        animatorCtrl.Climb(false);
        mTrans.position = link.endPos;
        agent.CompleteOffMeshLink();
        agent.isStopped = false;
        onClimbEnd.Invoke();
    }