ホーム » 「覚書」タグがついた投稿

タグアーカイブ: 覚書

CorgiEngineの情報があるところと覚書

2Dアクションゲームが作れるアセット。
2Dアクションの基本はだいたい網羅されてて、カスタマイズもできる。
いつもアセットストアの目立つところにあるので、きっと良いものに違いない。
気になって購入した。

今は、使い方を覚えようと情報集め中。
CorgiEngineの情報があるところメモしたよ。

◆公式ドキュメント

◆公式YouTube

◆CorgiEngine-1-とりあえず使ってみる/げんとめブログ

◆Corgi Engineを勉強中 Part.1〜最小のシーンを作る

◆Unity&CorgiEngineを使ったアクションゲーム作り ~アニメーションと当たり判定①~

◆Corgi EngineのNPCのAIを細かく砕く


とりあえずやってみたこと。

●MinimalLevelという最低限必要なものだけがあるシーンがあり、それをコピーする。
●キャラクターを追加するのは、任意のゲームオブジェクトに「Character」というコンポネートを追加。それをプレイヤーとして使いたい場合は、コンポネート内の「Autobuild Player Character」それ以外のAI(敵とかNPC)にしたい場合は、「Autobuild AI Character」を押す。
●色んな能力が追加されるので、いらないものを外したり、変更したりでオリジナルのキャラクターにしていく。
英語なのがネックなだけで、欲しい能力はチェックして、変更したい場合は数値をいじったり、いらないのは外すという素直な作りなので、理解しやすいと思う。

ジェットパックがいらないと思ったら「Character Jetpack」のチェックを外せばいけました。
デフォで2段ジャンプだったので1度でいいと思ったら、「Character Jump」の中の項目「Number Of Jumps」の数値を1に変更したらOKでした。
落下中ジャンプができてしまうのをできないようにしたいと思ったら、「Character Jump」の中の項目「Jump Restrictions」の選択タブを「Can Jamp On Ground」にしたらできた。


とりあえずやってみたのはここまで。
どんな機能があるのかは、学習中であります。

Unityリフト移動

Unityでつまずきやすいポイントのメモ。
移動するリフトに乗っても、プレイヤーは移動しない問題。
床だけが移動するリフトというのも面白いけど、一緒に動きたい場合は、
リフトに乗っている間だけ親子関係にするとよい。
子供のオブジェクトは、親の動きと同期する。

↓の記事が詳しく載っていました。
Unityで動く床を実装するときにハマる罠とその解決方法

これの応用で、接地している間だけ、リフトの形状を変えたり、動きを変えたりもできる。

タグの種類を増やしてって、リフトの種類も増やせる例を作ってみた。 コードは乗る側、タグはリフト側で設定。
void OnCollisionEnter(Collision col)
    {
        //接触した相手のタグが"LiftA"場合、その子供になる
        if (col.gameObject.tag == "LiftA")
        {
            transform.SetParent(col.transform);
        }

        //接触した相手のタグが"LiftB"場合、相手のサイズを変える
        if (col.gameObject.tag == "LiftB")
        {
            col.transform.localScale = new Vector3(20, 1, 5);
        }

     }

    void OnCollisionExit(Collision col)
    {
        //接触が終わったとき元に戻す
        if (col.gameObject.tag == "LiftA")
        {
            transform.SetParent(null);
        }

        if (col.gameObject.tag == "LiftB")
        {
            col.transform.localScale = new Vector3(5, 1, 5);
        }
    }
    

Unity覚書 二次配列のマップ

Unityで二次配列を使ってマップを作るやつ。よく忘れるのでメモ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MAP : MonoBehaviour
{
    public GameObject kabe;
    public GameObject jimen;
    public GameObject st;


    int[,] map = new int[,] {

        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 
        { 1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1},
        { 1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1},
        { 1,0,0,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,1},
        { 1,0,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1},
        { 1,0,1,0,0,0,0,0,1,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1},
        { 1,0,1,1,1,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,1,1,1,1},
        { 1,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,1,1},
        { 1,0,1,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,1},
        { 1,0,1,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1},
        { 1,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1},
        { 1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1},
        { 1,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1},
        { 1,1,1,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1},
        { 1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1},
        { 1,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1},
        { 1,0,0,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1},
        { 1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1},
        { 1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1},
        { 1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1},
        { 1,0,0,0,0,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,0,0,1},
        { 1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1},
        { 1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1},
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

    };


    // Start is called before the first frame update
    void Start()
    {
        
        for (int i= 0;i< 24; i++){
            for (int j = 0; j < 24; j++)
            {

                if (map[i,j] ==0) { Instantiate(jimen, new Vector3(i * 1, 0, j * 1), transform.rotation); }
                if (map[i,j] ==1) { Instantiate(kabe, new Vector3(i * 1, 1, j * 1), transform.rotation); }
                if (map[i, j]==2) { Instantiate(st, new Vector3(i * 1, 0, j * 1), transform.rotation); }
            }
        }
    }


    // Update is called once per frame
    void Update()
    {
        
    }
}

Archery Motion Packドキュメント和訳

Archery Motion Pack
Unityアセット。矢のような発射物撃つための基礎パック。
Motion Controller v2 と連動してるので、ついでに購入しました。

Motion Controller v2 を併せて購入しないと使用できないので注意。
Motion Controller同様に、ドキュメントが英語の為、日本語和訳したものをメモ。覚書。


モーションパック/Motion Packs
モーションコントローラーのUIがわずかに変更され、「Packs」のボタンが追加されました。
「Packs」ボタンを押すと、プロジェクトにインポートされたモーションパックがリストされます。パックを選択すると、パックに関する詳細情報が提供されます。
この場合、「Archery」パックを選択すると、Archery Packの詳細がリストされます。
各パックには異なるオプションが表示される場合があります。アーチェリーパックの場合、各オプションについて説明します。下部の「Setup Pack」ボタンをクリックすると、チェックされたオプションが実行されます。

Animator Layer
装備、保管、および攻撃の動きをどのレイヤーに適用するかを決定します。  これにより、歩行中に装備と射撃が可能になります。

Create Mecanim
このオプションは、パックのモーションで使用されるMecanimサブステートマシンを作成/再作成するために使用されます。
これがまさに通常のモーションで行うことです。
ここでショートカットを作成します。

Create Motions
これは実際に弓の動きを作成するオブジェクトです。 Movement Styleオプションに基づいて、特定のモーションが有効化および無効化されます。

Create Input Aliases
オンにすると、モーションで使用されるすべての必要な入力エイリアスがUnityの入力マネージャーで作成されます。これは、プロジェクト全体で行う必要があるだけです。

Create Inventory
在庫ソリューションがない場合、このオプションは「基本在庫」コンポーネントを作成し、キャラクターに追加します。

Create Attributes
属性ソリューションがない場合は、このオプションは、「基本属性」コンポーネントを作成し、キャラクターに追加します。

Create Core
キャラクターにアクターコアがない場合、自動的に作成されます。

通常、「セットアップパック」を押す前に、これらのオプションをすべてチェックしたままにします。
ただし、キャラクターをカスタマイズして他のアセットを含めると、基本的なインベントリソリューションが不要になる場合があります。

Inputs
ほとんどの場合、キャラクターの移動と制御にはUnityの標準入力を使用します。 ただし、武器の照準や鞘のようなものをサポートするために、いくつかの新しい入力エントリが追加されています。

これらすべての追加エントリには、「キーボード」エントリとXboxコントローラーエントリがあります。

モーションコントローラーと入力ソースの標準に従って、特別なキー(Bow-Unsheatheなど)が必要な各モーションでは、入力エントリを変更できます。
これらをアクションエイリアスと呼び、モーションをトリガーします。
 たとえば、Bow – Unsheatheは上記の「Sheathe Bow」エントリを使用します。

このアプローチを使用すると、「アクションエイリアス」を設定するか、エイリアスが表すキーまたはボタンを変更することで、モーションが使用する入力エントリを変更できます。

キーまたはボタンの変更方法は、使用している入力ソリューションによって異なります。
  標準のUnity Input Managerの場合、「編集| プロジェクト設定… | Unityのメニュー項目を入力します。

アクターコア/Actor Core
前述したように、アクターコアはすべてのキャラクターに存在し、キャラクターの意思決定とロジックの一部を表します。
アクターコアを持つキャラクターに矢が当たると、ダメージを受けて適切に反応するのはアクターコアです。

オブジェクトが破損または破壊されないオブジェクトである場合、Actor Coreは必要ないことに注意してください。

アクターコアは非常に基本的なものです。次のプロパティがあります。

Attribute Source(属性ソース)
アクターの属性を含むコンポーネント。

Health ID(ヘルスID) ヘルス値を保持する属性のIDである文字列。

Is Alive オブジェクトがまだアクティブかどうかを決定する単純なブール値。

Damaged Motion
ダメージが矢から取られたときにアクティブにするモーションの名前。

Death Motion
アクターが死ぬほどのダメージを受けたときにアクティブにするモーションの名前。

Code Summary
内部的に、Actor Coreにはいくつかの重要な機能があります。

OnDamaged()
この関数は、ActorCoreを持つオブジェクトに影響を与えるときにArrowCoreによって呼び出されます。
これは、矢がヒットしたキャラクターとダメージの程度をキャラクターに伝える方法です。
この関数では、ActorCoreは属性ソースに体力の程度を尋ねます。
ダメージがこのヘルスを超えると、キャラクターは死にます。

OnDeath()
この関数は、ダメージがキャラクターの体力を超えた場合にOnDamaged関数によって呼び出されます。

死のアニメーションが終了すると、モーションコントローラーは無効になります。

IActorCore Interface
独自の「actor heart beat」MonoBehaviourがある場合、 IActorCoreインターフェイスをクラスに追加し、これを無視するだけです。繰り返しますが、目標はモジュール式で交換可能にすることです。
基本属性/Basic Attributes

Actor Core内に単にヘルス属性を保存することもできましたが、属性を管理している可能性のあるRPGアセットをサポートするのに十分なモジュール性を確保したかったのです。

あなたが以前から思い出すなら、私は属性ソースについて話しました。ソースは、使用されているソリューションに関係なく属性を取得するために使用できる単なるブリッジです。この「基本属性」コンポーネントは、RPG属性アセットの非常に基本的なバージョンです。すべての属性ソースと同様に、IAttributeSourceインターフェイスを実装します。

この方法で属性を実装することにより、ゲームに新しい属性を追加できます。
Archeryアドオンでは、1つの属性のみが重要です。

HEALTH キャラクターが実際に持っている現在の健康。覚えている
これは、上記のアクターコアで使用したIDです。

コードの要約
属性ソースとして、次の機能を使用できます。

GetAttributeValue()この関数は、指定された名前の属性の値を返します。

SetAttributeValue()この関数は、名前を指定して属性の値を設定します。

イメージできるように、これらの2つの関数は、キャラクターの現在の健康状態を取得して保存するために、Actor Coreによって使用されます。
アクターコアは、「健康」属性に基づいて、キャラクターが単に損傷したか殺されたかを判断します。

基本インベントリ/Basic Inventory
使用する在庫ソリューションにはIInventorySourceインターフェースを実装する必要があります。これにより、情報を取得する方法がわかります。

私の「基本インベントリ」ソリューションは非常に基本的なものですが、インベントリソースです。
私の実装には3つのリストが含まれています。
アイテム、スロット、武器セット。

アイテムリストには、キャラクターがインベントリに持っているすべてのアイテムとそれらのいくつかのプロパティが含まれています。

スロットリストは、アイテムの使用状況を表します。
したがって、「LEFT_HAND」スロットは、左側に装備されているものを定義します。
「READY_PROJECTILE」スロットは、使用可能な矢を決定します。
左の例では、キャラクターには弓(「Longbow_01」)と矢のセット(「Arrow_01」)があります。
現在、彼は左手に何も持っていませんが、彼の矢筒は矢のセットを持っています。

武器セットを使用すると、アイテムをグループ化して、装備と保管を同時に行うことができます。
たとえば、「武器セット2」にはLongbow_01とArrow_01が含まれます。別の武器が私の剣と盾になると想像できます。

アイテム/Items
各アイテムには次のプロパティがあります。
ID アイテムを一意に識別する単純な文字列。
Equip Motion アイテムの装備に使用されるモーションの名前
Store Motion アイテムを保存するために使用されるモーションの名前
Instanceアイテムである編集時に作成されたインスタンス
Resource Pathこれは、アイテムを表すプレハブを見つけることができるUnityリソースフォルダーのパスです。
この値を使用して、時間が来たら弓と矢を作成します。
スロット/Slots

各スロットには次のプロパティがあります。
ID –スロットを一意に識別する単純な文字列。
アイテムID 現在スロットにあるアイテムのID。空の値は、スロットが空であることを意味します。

アイテムの変更
武器セット(武器セット2など)を装備すると、武器セットのアイテムが装備されます。 これらの武器セットアイテムは、どのアイテムがどのスロットに入るかを定義します。 したがって、スロットのアイテムが更新されます。

そのため、デフォルトでは「READY_PROJECTILE」スロットには「Arrow_01」アイテムが表示されます。 「Arrow_01」アイテムは、アイテムの「リソースパス」プロパティを使用してスポーンする矢印を定義するプレハブの場所を示します。

新しい種類の矢印を作成するとしましょう… [アイテム]セクションに新しいアイテムとして追加し、「Arrow_02」などのIDを付けて、リソースパスを新しいプレハブに設定します。 次に、スロットにアイテムを設定する武器セットアイテム(「READY_PROJECTILE」)で、エントリの「アイテムID」の値を「Arrow_01」から「Arrow_02」に変更します。

矢を別の方法で変更する場合は、[スロット]セクションでアイテムIDを直接変更できます。

コードの要約
インベントリソースとして、次の機能を使用できます。

GetResourcePath()指定されたアイテムのリソースパスを取得します。
EquipItem()指定されたスロットに指定されたアイテムを装備します。
GetEquippedItemID()指定されたスロット内のアイテムのアイテムIDを取得します。
ClearSlot()指定されたスロットからアイテムを削除します。 これらの関数は、弓と矢を作成し、弓を装備/装備解除するためにアーチェリーの動きで使用されます。 繰り返しますが、必要なインベントリソリューションを使用できます。しかしながら、 そのソリューションは、IInventorySourceインターフェイスを実装する必要があります。
レチクル/Reticle
シーンにレチクルを追加するのは、付属のCrosshair Fill Circleスクリプトを使用するだけです。

BGテクスチャは、レチクルの背景画像です。
カスタマイズするには、画像を置き換えるだけです。

塗りつぶしテクスチャは、弓に動力が供給されているときにBGテクスチャをオーバーレイするものです。 このテクスチャも置き換えてください。

弓の動きにより、レチクルが自動的に有効化、無効化、および更新されます。


パックには、ゲームで使用できる弓が含まれています。弓のプロパティをカスタマイズすることも、ガイドラインに従って独自の弓を作成することもできます。

弓は、モデル、コア、プレハブの3つの部分で構成されています。

弓モデル
このモデルは、実際にはボーン付きのスキンメッシュです。このようにして、引き戻すときに弓を曲げることができます。この弓は、Mayaで作成、リギング、およびスキン作成されました。

IKを使用してジョイントを曲げるので、弓をアニメートする必要はありません。

スケルトンのルートは、矢が置かれる場所です。

画像は、Mayaの弓とボーンの配置方法を示しています。
特定の数のボーンは必要ありません…しかし、追加するほど曲線は滑らかになります。

弦の中心にもボーンがあります。それが「nock」であり、矢を固定する場所です。
したがって、nockを戻すと、弦と矢も戻ります。

骨の名前
使用する必要がある4つの重要な名前があります。
「root」はスケルトンを開始するボーンです。
「nock」は、弦の中央の骨です。
「upper1」は、曲げる弓の上部にある最初のボーンです。
「lower1」(図示せず)は、曲げる弓の一番下の最初のボーンです。
Bow Coreは、トランスフォーム階層でこれらのトランスフォーム名を探します。

ボウコア/Bow Core
弓の芯は弓の鼓動です。弓の曲がり方、力などを制御します。
キャラクターの左手のボーンがどのように作成されるかわからないため、補正するために「Local Position(ローカル位置)」と「Local Rotation(ローカル回転)」の値を含めます。

これには試行錯誤が必要ですが、左手の骨に対する弓の位置と回転をオフセットできます。

MountPointsを使用している場合、これらについて心配する必要はありません。

弓にはオーバードロー(またはパワーアップ)する能力があるため、ドローパワーとインパクトパワーは範囲です。

引き力は、弓がどれだけ遠くに飛ぶかを決定します。
この値は、飛行する前に矢印に加える力の大きさです。
したがって、オーバードローがない場合、上の画像は1600の値を使用します。100%オーバードローがある場合、2000の値を使用します。

これらの値は、矢印の剛体のAddForce()関数で使用されます。

Impact Powerは、矢印が剛体に衝突するときに使用する乗数です。

これにより、弓自体が矢印の力を超える力を追加できます。これは、矢印のヒット強度を上げるのに役立ちます。

弓プレハブ/Bow Prefab
最後の部分は、弓のプレハブ自体です。弓が装備されたら、プレハブをインスタンス化します。

プレハブを構築するとき、プレハブの原点がハンドルと一致し、前方を向くように、弓のスキンメッシュを配置します。これにより、キャラクターの手に入れるのが簡単になります。

ご想像のとおり、プレハブにはBow Coreと、プレハブに固有の変更した設定が保持されます。

複数のプレハブを作成することで、ロングボウ、ショートボウ、さらに遠くに発射するマジックロングボウなどを作成できます。

矢/Arrow
弓と同様に、矢をカスタマイズできます。
矢印も、モデル、コア、プレハブの3つの部分で構成されています。

矢モデル/Arrow Model 
矢印モデルは単なる静的メッシュです。方向と起源以外に特別なことは何もありません。

Unityでは、順方向を矢印の順方向にする必要があります。

起源については、私はそれを矢じりの先端に置くのではなく、もっと後ろに置きます。その理由は、ターゲットに矢印を埋め込むときに、矢印がターゲット内にあるように見せたいからです。

アローコア/Arrow Core
アクターコアおよびボウコアと同様に、アローコアはアローの鼓動です。衝突を検出し、衝突が発生したときに反応する方法です。
Embed Distanceは、ターゲットが衝突したときに矢をターゲットにプッシュする少し余分な量です。
ほとんどのキャラクターにはボディメッシュから離れたコライダーがあるため、これを行います。これにより、矢印が実際に頭または胸の中にあるように見えます。

Tail Distanceは、矢を元に戻すとき、弦からの距離を決定するために使用するものです。矢を引き戻すためのオフセットのようなものだと考えてください。

矢がターゲットに影響を与えると、Max Ageによって矢の有効期間(秒単位)が決まります。0に設定すると、矢はそれ自体を破壊しません。

Impact Powerは、ターゲットが剛体である場合にターゲットに適用される力の基本的な大きさです。

これが、Unityの物理学の下でターゲットを移動させる原因です。
最終的な力の大きさは、この値に弓の衝撃力を掛けたものになります。

Damageは、ダメージ範囲です。
Minは、弓の特性と同様に、オーバードローされていない場合の最小ダメージ。
Maxは、弓が100%オーバードローされている場合の最大ダメージ。

どちらの場合も、ターゲットにIActorCoreコンポーネントがある場合にのみダメージが適用されます。
Arrowプレハブ
矢印のプレハブには、剛体を含める必要があります。
リジッドボディは、実際に矢印を前進させるものです。
弓が発砲すると、リジッドボディのAddForce()メソッドを呼び出し、その方向に矢印を送信します。

独自のプレハブを構築するときは、Arrow Coreコンポーネントが無効になっていることを確認してください。
矢を放つときに有効にします。

コライダー
矢印プレハブにはコライダーがありません。

多くのテストを通じて、コライダーは矢印ではうまく機能しないことがわかりました。代わりに、矢印が飛ぶときに短いレイキャストを使用します。

このレイキャストは、ヒットしたものや角度などについて、より正確でタイムリーな情報を提供します。

Motions
前に、各モーションの簡単な説明をしました。ここで、モーションプロパティについて詳しく説明します。

ベーシックアイドル/Basic Idle
弓を手に持つシンプルなアイドルアニメーション。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed -回転する1秒あたりの度数。

Use Pivot Animations-回転中にピボットアニメーションを使用するかどうかを決定します。回転は90度未満の増分で行われる可能性があるため、アニメーションが過剰になる可能性があります。必要に応じて使用できます。

基本アイテム装備/Basic Item Equip
装備する右弓を決定してから装備するUnsheatheアニメーション。

Action Alias-弓を装備する入力エントリ

Bow Resource Path-インベントリソースを使用しない場合は、弓プレハブへのリソースパスをインスタンス化します。

Inventory Source–弓のリソースパスを取得する在庫ソース。
空のままにした場合、在庫ソースがこのキャラクターにあるかどうかを確認します。

Equip Slot ID-弓を配置するインベントリソースのスロットID。

Bow Ready Slot ID –インベントリソースのスロットID。どの弓を装備する必要があるかを示します。 基本アイテムストア/Basic Item Store
弓を片付け、通常の(弓ではない)アイドル状態に戻ります。

Action Alias–弓を装備解除する入力エントリ

Inventory Source –弓を装備していないと言うために使用する在庫ソース。

Equip Slot ID–クリアするインベントリソースのスロットID。

Basic Walk Run Pivot
移動中、手に弓を持つ動き。
この移動スタイルは、より「アドベンチャー」スタイルであり、軌道カメラで使用する場合、キャラクターはカメラに向かって歩くことができます。

Default to Run–キャラクターがデフォルトで走行または歩行するかどうかを決定します(アクションエイリアスによって反転します)。

Run Action Alias-[Default to Run]オプションに基づいてキャラクターの走行(または歩行)をトリガーするために使用します

Walk Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Run Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Rotation Speed-回転する1秒あたりの度数。
Basic Walk Run Store
移動中、手に弓を持つ動き。
この動きのスタイルは、より「シューター」スタイルであり、常にキャラクターが前方を向いています。ストラフィングをサポートします。

Similar to the standard WalkRun …モーションと同様に、WalkRunPivotまたはWalkRunStrafeのみを有効にします。両方ではありません。

Default to Run–キャラクターがデフォルトで走行または歩行するかどうかを決定します(アクションエイリアスによって反転します)。

Run Action Alias-[Default to Run]オプションに基づいてキャラクターの走行(または歩行)をトリガーするために使用されます。

Walk Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Run Speed -0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed-回転する1秒あたりの度数。

Stop Delay – Mecanimブレンドツリーを支援するために、停止する前に追加する小さな遅延。
Basic Ranged Attack
矢印を発射するために使用されるモーション。

Attack Action Alias –弓を撃つようにキャラクターをトリガーするために使用されます。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed -回転する1秒あたりの度数。

Horizo​​ntal Angle –左腕のヨー(左/右回転)をオフセットするIK値。これは、弓を向けるのに役立ちます。

Vertical Angle-左腕のピッチ(上下の回転)をオフセットするIK値。これは、弓を向けるのに役立ちます。

Quick Horizontal Angle -クイックショットを行うときに左腕のヨー(左/右回転)をオフセットするIK値。
これは、弓を向けるのに役立ちます。

Quick Vertical Angle –クイックショットを行うときに左腕のピッチ(上下の回転)をオフセットするIK値。
これは、弓を向けるのに役立ちます。

Arrow Resource Path -インベントリソースを使用しない場合、インスタンス化する矢印プレハブへのリソースパス。

Inventory Source –弓のリソースパスを取得する在庫ソース。空のままにすると、在庫ソースがこのキャラクターにあるかどうかを確認します。

Arrow Ready Slot ID –どの矢印を装備する必要があるかを示すインベントリソースのスロットID。

Release From Camera –デフォルトでは、矢印は弓の現在の位置から発射します。 ただし、アニメーションによっては、矢印が小さな角度で発射される場合があります。
 矢印を完全に制御したい場合は、代わりにカメラから撮影してください。 これは、肩越しモードに特に役立ちます。

Release Time–アニメーション内で矢印をリリースするとき。

Default Draw Force-弓から値が設定されていない場合、矢印を発射するデフォルトの力。
Basic Damaged
アクターが矢印に当たったときに使用されるアニメーション。
Basic Death
アクターが矢印で殺されたときに使用されるアニメーション。

NPC
Archery Motion PackはNPCをサポートしています。
これを行うには、PCと同じようにNPCを設定します。
次に、さらにいくつかの変更を加えます。

最初に、変換を使用して動きを決定するようにアクタコントローラが設定されていることを確認します。
次に、入力ソースまたはカメラリグが自動的に設定または検出されないことを確認します。
最後に、NPCにはNPCSの他のコンポーネントとともに「戦闘員」コンポーネントを追加する必要があります。
Code
これらの変更により、NPCを制御する準備が整いました。
Node Canvas、Behavior Designer、またはその他のAIドライバーのいずれかを使用するか、コードを使用してNPCを制御できます。
アセットには、見て、使用するためのデモといくつかのNPCコードが含まれています。

デモ:Assets \ ootii \ _Demos \ MotionControllerPacks \ Archery \ Demos \ Scenes \ demo_NPC_Shooter

AIコード:Assets \ ootii \ _Demos \ MotionControllerPacks \ Archery \ Demos \ Scenes \ AMP_NPC_Controller

通常の移動ロジックに加えて、NPCが矢を発射できるようにする実際のコードは次のとおりです。

CombatMessage lMessage = CombatMessage.Allocate();
lMessage.ID = CombatMessage.MSG_COMBATANT_ATTACK;
lMessage.Attacker = gameObject;
lMessage.Defender = Target.gameObject;
mMotionController.SendMessage(lMessage);
CombatMessage.Release(lMessage);

NPCアーチャーが弓を装備している場合、この「攻撃」メッセージを送信すると、ディフェンダーに向かって発砲します。
防御側の代わりに射撃する方向を設定することもできます。 防御者の代わりに、メッセージに「HitDirection」vector3変数を設定するだけです。

ActorControllerのドキュメント和訳

MotionController同様、公式ドキュメントが英語なので、日本語にしたものをメモ。
複雑なところは割愛。


概要
アクターコントローラーは、Unityの標準的なキャラクターコントローラーの代わりであり、高度な機能を提供します。
Unity 5ソリューションで単独で使用できますが、モーションコントローラーの基盤でもあります。

特徴
アクターコントローラーは次の機能をサポートしています。
・壁、天井などの上を歩く
・プラットフォームでの移動と回転
・超高速移動
・急な斜面を滑る
・キャラクターを地面の傾斜に合わせる
・カスタムボディ形状の作成
・外力に反応する
・Nav Meshエージェントをサポート
・ルートモーションをサポート
・あらゆる入力ソリューションをサポート
・ゼロガベージコレクション*
・コードを含む(C#)

アクターコントローラー/Actor Controller
環境と外力に応じて、全身のキャラクターの動きと回転を制御します。

アクタードライバー/Actor Driver
ユーザー入力、AIなどに基づいてアクターコントローラーがどのように動くかを決定します。含まれているアクタードライバーは 使用可能ですが、拡張することもできます。 実際、必要に応じて独自のドライバーを作成できます。
注:モーションコントローラーを所有している場合、モーションコントローラーがドライバーです。

入力ソース/Input Source
キーボード、マウス、ゲームパッドなどからのユーザー入力を収集するために使用されます。これを分割することにより、 基本的なUnity入力ソースが提供されるか、サードパーティの入力ソリューションを使用する入力ソースを作成します。

このアプローチを使用すると、任意の入力ソリューションを使用できます。
また、アクタードライバーがアクターコントローラーに指示する方法を変更することにより、アクターの動きを変更することができます(つまり、歩くか飛行するか)。
これは、同じシーン内の異なるキャラクターを異なる方法で、または異なるプレーヤーでさえ制御できることを意味します。
Unity入力ソース– Assets / ootii / Framework_v1 / Code / Input

これは、UnityのネイティブInput Managerソリューションを使用して入力を読み取るデフォルトの入力ソースです。 キーボード、マウス、Xboxコントローラーでの基本的な移動と表示をサポートしています。

Xboxコントローラーを有効にするには、チェックボックスをオンにします。

適切な値がUnityの入力マネージャーリストに追加されます(必要な場合)。
「Viewing Activator」プロパティを使用すると、回転/表示をアクティブにする方法を決定できます。 たとえば、「右マウスボタン」に設定すると、アクターは右マウスボタンが押されたときにのみ回転します。
クイックコーディング
たとえば、UnityInputSource.csファイルは、MCに付属する入力ソースであり、Unityのネイティブ入力ソリューションを利用するために使用されます。
次のフォルダーにあります。
Assets\ootii\Framework_v1\Code\Input
独自の入力ソースを作成するには、UnityInputSource.csをコピーし、
などの名前に変更して、クラス名を変更します。
これで、入力ソースの必要に応じて関数の内容を変更できます。
カスタムアクタードライバー
これらのドライバーは、基本的な動きのケースを処理し、さまざまな状況で機能します。
しかしながら、独自のドライバーを作成して、アクターを自由に制御することもできます。

最終的に、ドライバーは実際にアクターコントローラーの関数を呼び出しています。
ActorController.Move()
ActorController.RelativeMove()
ActorController.Rotate()

独自のドライバーを作成するときに使用できる他の機能がいくつかありますが、上記の機能は基本です。

力を適用するためのもう1つの便利な関数は次のとおりです。

ActorController.AddImpulse()

これはジャンプのようなものに力を加えることができます。ただし、ACは物理ベースのコントローラーではなく、入力ベースのコントローラーであるため、AddImpulse()を使用してキャラクターを通常に移動しないでください。

パッケージには、使用できるいくつかのアクタードライバーが含まれています。

Actor Driver –Assets/ootii/ActorController/Code/Actors/
これがデフォルトのドライバーです。 キーボード、マウス、およびXboxコントローラーからの入力を受け取り、それをキャラクターの順方向に相対的な動きと回転に変換します。 次に、Actor Controller関数を呼び出して、実際にアクターを移動します。
Animator Driver – Assets / ootii / ActorController / Code / Actors / CharacterControllers / Drivers Actor Driver
Actor Driverから継承しますが、ゲームオブジェクトにアタッチされているUnity Animatorを探します。 見つかった場合、ルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。 ルートモーションデータが見つからない場合は、入力を使用してキャラクターを制御します。
Mesh Driver – Assets / ootii / ActorController / Code / Actors / CharacterControllers / Drivers
Animator Driverから継承しますが、Nav Mesh Agentを使用してアクターを特定のターゲットに移動します。 Animatorが見つかった場合、Animatorはルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。ルートモーションデータが見つからない場合、速度はコンポーネントに設定されます。

Sphere Actor Driver – Assets / ootii / _Demos / ActorController / Code
アクタードライバーから継承します。 「内側の」球体が見つかると、これはアクターの体を使用し、それに基づいて回転します。
キャラクターが動いている方向。これは、球体が回転しているような印象を与えます。

Spider Actor Driver – Assets / ootii / _Demos / ActorController / Code
Animator Driverから継承します。他のドライバーと同様ですが、ジャンプを押すと(そしてアクターが壁に面している場合)、壁にジャンプして登ることができます。

Coding an Actor Driver
アクタードライバーのコーディングは、実際には入力を読み取り、アクターコントローラーに何をするかを伝えるだけです。
ACをコーディングするには、回転が2つの部分に分かれていることを理解する必要があります。ヨーとチルト。

通常、アクターコントローラーの次の機能を使用します。
Move(Vector3) ワールド空間に基づいてアクターを移動します。
RelativeMove(Vector3) ローカルスペースに基づいてアクタを移動します。
SetPosition(Vector3) 絶対位置の値を強制します。
Rotate(Quaternion) アクターを「上」軸を中心に回転します。 この回転は通常「ヨー」と呼ばれます。
Rotate(Quaternion、Quaternion) ヨーとチルトを回転します。
SetRotation(Quaternion) 絶対回転値を強制します。
Body Shapes and Colliders
ボディシェイプは、Actor Controllerによる衝突検出に使用されます。球体とカプセルを使用することにより、人間の形状や他の単純でないキャラクターを表現できます。また、キャラクターのポーズに合わせて、実行時にこれらの形状を変更する機能もあります。

デフォルトのセットアップには2つの形状があります。
ボディカプセル–このカプセルは、従来のキャラクターコントローラーに似ていますが、地面から持ち上げられます。これにより、アクターはステップの端まで到達できます。これは、足IKに最適です。

Foot Sphere-この球体は空中でのみアクティブです。これにより、オブジェクトを飛び越えるときに足が物に入らないようにします。ただし、棚やステップの近くに移動しても、ブロックされることはありません。

体の形はコライダーではないことに注意することが重要です。そのため、外部のレイキャストや剛体はそれらに反応しません。外部のレイキャストをキャラクターに当てたい場合は、通常の方法で従来のUnityコライダーをアクターに追加するか、「Unityコライダーを使用」チェックボックスをオンにします。

コライダーの代わりにボディシェイプを使用する理由は、通常のUnityカプセルコライダーはあまり柔軟性がないためです。任意に回転したり、異なる変換に結び付けることはできません。つまり、キャラクターがアニメーション化しても、その形状は自動的に変化しません。
例えばUnityカプセルコライダーが、頭部の変形に合わせて自動的にサイズ変更できないことに注意してください。
また、基本的な方向に固執しています。
ただし、ボディシェイプカプセルは、関連付けられている変換に合わせてサイズ変更および回転します。したがって、キャラクターの形状は自動的に変更されます。
Unity Colliders
Unityカプセルコライダーの制限を補うために、各ボディシェイプには、ボディシェイプを使用してUnityコライダーを作成および管理するオプションがあります。
[Use Unity Colliders]チェックボックスをオンにするだけで、実行時にコライダーがボディの形状に合わせて作成されます。
球は簡単です。 ただし、Unityカプセルコライダーは実際には使用できないため、代わりに球体が使用されます。
少し混乱していますが、複数の球体を使用して、カプセルの位置、サイズ、回転を近似する方法に注目してください。
キャラクターの頭が動くと、球体が動きカプセルの形状を保ちます。
Rigidbodyコンポーネントをキャラクターに追加しても問題ありません。 ただし、剛体はキャラクターを制御しようとします。 つまり、剛体とACが競合していることを意味します。 これを修正するには、リジッドボディの重力を無効にし、「Is Kinematic」チェックボックスをオンにします。 これにより、リジッドボディがキャラクターを制御しようとするのを防ぎます。
Collisions vs. Grounding/衝突対接地
「衝突」と「地面」は異なるものです。
衝突とは、衝突検出により、壁などの別の物体にぶつかったと判断されたことを意味します。
接地とは、アクターの直下で地面をテストし、その上に立つことができることを意味します。
そのため、衝突を完全に無効にすることができ、キャラクターは引き続き地面を歩いたり、斜面を上ったりできます。衝突を無効にすると、パフォーマンスが大幅に向上します。 これは、レール上にあるか、動きが制限されているNPCに最適です。
コライダー/Colliders
アクターコントローラーは、標準のユニティコライダーと衝突することができます。 最速のコライダーは、球、箱、および飛行機です。 ただし、メッシュコライダーに対する衝突も検出できます。
ただし、UnityのCharacter Controllerと同様に、メッシュコライダーと衝突するとパフォーマンスに影響があります。

Unity 5.3では、ACはUnityの非割り当て物理呼び出しを使用しています。 これは、衝突によってパフォーマンスが低下する可能性のあるガベージを作成しないため、モバイルに最適です。 ただし、これらの呼び出しは、プレーン(およびおそらく他の形状)の背面との衝突を引き起こします。
衝突レイヤー/Collision Layers
Actor Controllerは、標準Unityのレイヤーを使用して、衝突する対象を決定します。
コリジョンセクションでレイヤーを設定するだけで、同じレイヤーにあるオブジェクトやプロップと衝突します。 オブジェクトがコリジョンレイヤーに含まれていないレイヤー上にある場合、キャラクターは単にオブジェクトを通過します。
レイヤーで接地を有効にするには、「Use Grounding Layers」チェックボックスもオンにする必要があります。
メッシュコライダー/Mesh Colliders
影響を最小限に抑えるため、メッシュコライダーを解析し、将来の衝突に備えてその情報を保存します。 小さなメッシュの場合、これは最初の影響で実行できます。 ただし、大きなメッシュの場合、アクターコントローラーでメッシュコライダーを前処理する必要があります。

これを行うには、Moos Colliderオブジェクトを持つゲームオブジェクトにootii Mesh Partitionerコンポーネントを追加します。 次に、「開始時に解析」をチェックします。

残りのオプションはすべて、エディターでパーティションを視覚化するためのものであり、有効にしないでください。
アクターコントローラーの詳細設定
Grounding
Is Gravity Enable
重力を使用するかどうかを決定します。

Is Relative
重力が世界の向き(Vector3.up)または地面の法線に基づくかどうかを決定します。

壁を歩くには、このオプションを設定する必要があります。

Extrapolate Physics
アクターコントローラーは、すべての処理にLateUpdate()関数を使用します。ただし、物理レートベースの情報(重力やジャンプの力など)は、フレームレート間で一貫性を保つためにFixedUpdate()で処理されます。
これら2つの機能は常に同期しているわけではありません。

落下中にどもる場合、このオプションをチェックするとスムーズになります。
Gravity(重力)
重力の力と方向を決定します。値が設定されていない場合、Unityの重力値を使用します。
最終的な重力方向は、Is Relativeフラグによって決定されます。

Skin Width(スキン幅)
アクターのボディシェイプと、衝突または接地するオブジェクトとの間に許可されたわずかなスペース。

Mass(質量)
アクターの質量。外力を適用するときにこの値を使用します。 Unityの標準を使用します。これは約1単位= 1立方体=約35 kgです。

Grounding Start(接地開始)
接地のために光線を撮影する場合、これはキャラクターのルートからの高さであり、光線を下方に撮影し始めます。

Grounding Distance(接地距離)
接地線をキャラクターのどのくらい下に射撃するかを決定します。

Grounding Radius(接地半径)
光線に加えて、球体は隙間に落ちるのを防ぐために下向きにキャストされます。この値は、「足」の半径またはアクターの底でなければなりません。

Force Grounding(強制接地)
Force Distanceの範囲内にいるキャラクターを地面に押し下げるかどうかを決定します。

Force Distance(力の距離)
キャラクターが地面から離れることができる最大距離であり、Force Groundingがチェックされているときは、キャラクターを強制することもできます。


Collisions
Is Collision Enabled
衝突をテストするかどうかを決定します。

Stop Rotations
衝突によってキャラクターの回転が停止するかどうかを決定します。

Allow Pushbacks 
外部コライダーがアクターを移動させることを決定します。

アクターはただアイドル状態にあるが、コライダーがキャラクターに動いていると仮定します。このオブジェクトを使用すると、コライダーがキャラクターを押し戻して、キャラクターが貫通しないようにすることができます。
ただし、Unityキャラクターコントローラーのように、コライダーはキャラクターを別のコライダーにプッシュできます。そのため、これには注意が必要です。

このオプションを使用すると、パフォーマンスが低下します。控えめに使用してください。

Overlap Center
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これがその範囲の中心です。

Overlap Radius
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これは、使用する半径です。

エディターでは、衝突テストに使用されるオーバーラップ円を表す明るい灰色の球体が表示されます。 「Overlap」設定を使用して、キャラクターの大部分がカバーされるようにします。
Sliding
Is Sliding Enabled
角度が最小傾斜角よりも大きいスロープでは、アクターがスライドします。

Min Slope
アクターがスライドを開始する前に、(アクターの下の)スロープの最小角度。

Gravity
スライドするとき、スライドに適用される重力の割合。 これは、表面の摩擦を偽造するのに役立ちます。

Max Slope
アクターが上に移動できる最大傾斜。 傾斜がこれより大きい場合、キャラクターは移動を停止します。

Step
スロープが実際に開始する地点の終了点を見つけるために内部的に使用される小さな距離。 通常、この値を変更する必要はありません。

Orientation
これらの機能は、キャラクターが壁や天井を歩くつもりである場合に重要です。 これを行うには、キャラクターは歩いている表面の方向を向く必要があります。

Orient to Ground(地面に向ける)
アクターが立っているサーフェスの法線に一致するようにアクターが「アップ」ベクトルを変更するかどうかを決定します。

壁を歩くには、このオプションを設定する必要があります。

Keep Orientation(オリエンテーションを保つ)
アクターがジャンプ中に最後の方向を保持するかどうかを決定します。 チェックされていない場合、キャラクターはジャンプ中に自然な向き(Vector3.up)に戻ります。

Min Angle(最小角度)
方向の変更を引き起こす最小角度の変更。

Max Distance(最大距離)
アクターの向きが自然な地面(Vector3.up)に変わり始める前の地面からの最大値。

Freezing
これらのオプションを設定すると、指定した軸の動きと回転を制限できます。
Max Slope
Max Slopeを、バンプを登れるような大きな値に設定します。85度は極端です。 明らかに、これはキャラクターがその程度以下の傾斜を登ることを意味します。 あなたのゲームによっては、それは良い選択肢かもしれません。 Max Slopeを0に設定すると、内部的にデフォルトで70度になります。
Remove Colliders
小さな斜面からコライダーを取り外します。小さな傾斜がある場合、キャラクターがその上にぶつかることは本当に重要ですか? 2本の足を持つ人間の場合、通常は気付かないでしょう。
これは、地形を扱う場合に特に有効です。

誰かが私に1,000個の岩や小石が地面に散らばっているシーンを見せてもらいましたすべての岩と小石は、丘のコライダーの一部でした。コライダーは複雑で大規模なメッシュでした。
そのため、丘の全体的な傾斜は良好でしたが、小さな小石はそれぞれ急斜面になりすぎ、ACは丘を登ろうとしてたどたどしくなりました。

これは「現実の幻想」についての私のコメントに行きます。
すべての小石をコライダーの一部にすることは現実に近いかもしれませんが、それがあなたのゲームに与えるパフォーマンスの打撃は通常は価値がありません。

Slopes to Steps
コライダーを「スロープ(斜面)」から「ステップ(段差)」に変更します。
ACはステップとスロープを異なる方法で処理します。
ステップの場合、スムーズにポップアップします。したがって、斜面は斜面のように見えますが、コライダーは実際には90度の面を持つ立方体になります。
Slopes to Slopes
急斜面のコライダーをそれほど急ではないものに変更することで逃げることができるかもしれません。
FAQ: 階段と坂道をゆっくりと上昇するとき
ほとんどのキャラクターコントローラーには、「ポップアップ」ステップがあります。
それは機能しますが、キャラクターが1フレーム低く、次のフレームが高いため、少し耳障りになることもあります。これは、いくつかのステップがある場合に特に当てはまります。あなたはこのポップポップポップ体験を得ることができます。

典型的な解決策は、ステップのコライダーとしてランプを使用することです。これにより、階段を上るスムーズな方法が提供されますが、足のIKは個々のステップを認識しません。代わりに、階段で停止した場合、足IKは、自分が坂道に乗っており、足が傾いていると判断します。

スムーズなステッピング
そのため、ACには「smooth stepping」と呼ばれる機能が含まれています。基本的に、ポップアップするのではなく、時間をかけてステップアップします。
「Step Up Speed」は、より高いステップに移動する速度(単位/秒)を決定します。

「Step Down Speed」は、下のステップに移動する速度を決定します。

「Max Angle」は勾配に使用されます。地面の角度がこの値より急な場合、スムーズなステップを無効にします。
キャッチ
キャッチは、より長い階段やランプを扱うとき、キャラクターがあなたが前進するよりもゆっくりと上昇することです。 この場合、キャラクターは沈んでゆっくりと立ち上がっているように見えます。これを修正するには、いくつかのオプションがあります。

スムーズステッピングを無効にする
「Step Up Speed」および/または「Step Down Speed」を「0」に設定して、スムーズなステップを無効にします。 これにより、従来の方法でステップを上下させることができます。

速度を上げる
この「キャッチ」が通常発生する理由は、キャラクターが上下に移動するよりも速く前進するためです。 そのため、ゲームのプレイに合わせて速度を上げることができます。 ステッピングはより速くなり、前方への動きに追いつくはずです。

最大角度を下げる
斜面では、「Max Angle」を下げて、地形などのスムーズな踏み込みを無効にすることができます。 実際、「3」は地形に適した数値であることがわかりました。
FAQ:急斜面での沈没
キャラクターのコライダーがなぜ斜面に沈むのか、何人かの人に尋ねました。
ほとんどのキャラクターは完璧なカプセルや球体ではありません。ただし、カプセルと球体を使用して衝突領域を定義します。これらは衝突検出が高速であり、単純さを提供し、凹凸のある地面を移動するときに湾曲した底が役立つためです。ただし、急な傾斜が問題になる場合があります。

これは非常に簡単に視覚化できます。
最初の写真では、沈没は許可されていません。代わりに、コライダーを強制的に斜面で停止させます。この場合、キャラクターはもはや「接地」されておらず、実際には空中に浮いています。
これにより、キャラクターが浮かんでいるように見えるだけでなく、ACはキャラクターが浮かんでいるとみなし、動きを止めることができます。したがって、ドキュメントで前述したように、グラウンディングとコリジョンは異なる方法で発生します。
沈むもう1つの理由は、足IKです。コライダーの形状に厳密に従うと、足が地面に到達することはなく、環境に対してより自然な姿勢を強制することはできません。

とはいえ、これについてはある程度の制御が可能です。 「Enable on ramp」オプションを使用して、コライダーがランプを尊重するかどうかを決定します。
公正な警告:コライダーが傾斜路に沈むことを許可することもありますが、コードが重要だと感じた場合のみです。
FAQ:オリエンテーションの強制
向きは重力ではなく、地面に基づいていることに注意してください。 壁の上を歩くクモを取ります…世界の重力は変わりませんが、向きは変わりました。
ただし、重力セクションで「Is Relative」フラグを使用して、個人の重力を変更することでクモが壁にくっつくようにします。
これは向きの変化を引き起こさず、単に彼の重力が彼を地面の法線に引き寄せていることを確認します。 クモが壁にいる場合、壁に向かって押され、壁に「接地」されていることを意味します。

時々、キャラクターに特定の向きを持たせることができます。 実際、クモが壁にジャンプするときにACデモ(demo_Factor)でこれを行います。 クモの動きを担当するSpiderDriver.csファイルを確認してください。

これを行うには、ACのSetTargetGroundNormal()関数を使用します。この機能を使用すると、AC設定で「Orient To Ground」がオンになっている場合、俳優の向きを変更させる地面法線を強制できます。

SetTargetGroundNormalの設定に加えて、アクターがこの方向に向くのにかかる速度を変更することもできます。 OrientToGroundSpeedでそれを行うことができます。
繰り返しになりますが、SpiderDriver.csでこのすべてが発生しています。

・167行目:プレイヤーがジャンプを押し、壁が見つかりました。再配向の開始
・行175:ジャンプを押すプレーヤーに基づいてOrientToGroundSpeedを変更します
・179行目:方向を変えるとスパイダーが上に移動するようにインパルスを追加します
・行112:SetTargetGroundNormalが呼び出され、アクターが回転を開始します
・行105:アクターが新しい地上ターゲットに到達し、SetTargetGroundNormalがクリアされます

考えておくべきこと:アクターが自分の原点を中心に単純に回転すると、おそらく壁や床に埋め込まれてしまいます。そのため、それを防ぐために、衝動や動きを追加する必要があるかもしれません。私は179行目でそれをします

FAQ:ジャンプの追加
ジャンプは、いくつかの異なる方法で実装できます。 私は、キャラクターにリフトをかける力を使用してから、重力でキャラクターを引き下げます。
物理的な力によって動かされた根
このアプローチにはいくつかの利点があります。
1. ACは、キャラクターのルートを自分の足元に残しておくのが好きです。それがキャラクターの本当の位置です。そのため、ジャンプでルートを移動すると、オブジェクトの上に簡単にジャンプできます。
2.ゲームでは、ジャンプの力を変更するだけで、キャラクターのジャンプの高さを変更できます。
3.頭部の変形を使用するように体型を設定すると、体型はキャラクターのポーズに合わせて自動的にサイズ変更されます。ここの設定を参照してください。「ボトム変換」がどのように空であるかに注意してください。つまり、ルートに基づいています。 「トップトランスフォーム」は頭の骨に基づいています。
力を適用するには、次のようにACのAddImpulse関数を呼び出すだけです。
このような機能:
ActorController mActorController =
gameObject.GetComponent ();
mActorController.AddImpulse(transform.up * _JumpForce);
このアプローチを採用する場合は、通常、ジャンプアニメーションでキャラクターが立ち上がらないように設定します。代わりに、彼の足は根元にとどまります。生のアニメーションはそれ自体少し奇妙に見えますが、衝動を追加すると、見栄えが良くなります。
Animation Controlled Jump/アニメーション制御ジャンプ
AddImpulseアプローチを使用したくない場合は、ジャンプのアップムーブメントをアニメーションに含めることができます。 この場合、ルートモーションはないと仮定しています。 このアプローチの課題は、体が空中にある間、キャラクターの根がまだ地面にあることです。
ルートはアニメーションで移動しません

これを補うために、通常、コライダーを移動および/またはサイズ変更して、ジャンプの生涯にわたるキャラクターの位置を表します。
体の形でこれを行うには、次のようなコードを使用します。

 // Grab the first body shape as a capsule 
  BodyCapsule lCapsule = mActorController.BodyShapes[0] as   BodyCapsule; if (lCapsule != null)
   {
    // Changes the offset of the bottom part of the capsule
     lCapsule.Offset = Vector3.up * 0.25f;

    // Changes the offset of the top part of the capsule
     lCapsule.EndOffset = Vector3.zero;
  }
もちろん、ジャンプの発生時に設定を変更し、ジャンプが完了したら元に戻す必要があります。 考えるべきもう1つのことは、ルートがまだ地面にあるため、オブジェクトにジャンプすることは少し難しいことです。 その理由は、ルートが実際にジャンプしているボックスに入るからです。 例えば:
これらのすべての場合、ジャンプ、ルート位置、およびカプセル形状を補正するのはドライバー次第です。 ダブルジャンプ
ダブルジャンプを実装する場合、AddImpulse()を再度呼び出す前に、ACの「AccumulatedVelocity」プロパティをクリアする必要があります。その理由は物理学です…

ジャンプにAddImpluse()を使用する場合、重力を扱います。現実と同じように、上昇するにつれて速度が低下し(重力が初期ジャンプ速度に対抗するため)、頂点で速度が0になり、下降するにつれて速度が増加します(重力のため)。

速度の累積を「AccumulatedVelocity」変数に保存します。したがって、落下して重力が速度を上げると、フレームごとにキャプチャされます。

ダブルジャンプに対してAddImpulse()を再度実行すると速度が追加されるため、現在の累積速度に応じて異なる結果を得ることができます。あなたがジャンプの落下側にいて、多くの重力速度が蓄積している場合、ダブルジャンプでは再び上に移動するには不十分な場合があります。

AccumulatedVelocityをクリアすることにより、時間の経過とともに重力が増加し、蓄積が最初から始まる衝撃を取り除きます。それで、あなたはあなたの現在の位置からの新しい新鮮なジャンプをするでしょう。

AccumulatedVelocityをクリアするには、次のようなコードを実行します。

lActorController.AccumulatedVelocity = Vector3.zero;
よくある質問
アクターコントローラが互いに衝突するのを防ぐにはどうすればよいですか?
早い段階で覚えているなら、衝突と接地の違いについて話します。
2人のアクターが互いに衝突しないようにしたとしても、彼らがお互いを通過するときに奇妙な結果が得られる可能性があります。
それは、一方が他方の上に「接地」されることを望むためです。

たとえば、2人のアクターがいるとします。 1つはレイヤー#8に、もう1つはレイヤー#9にあります。

衝突を防ぐには、「Use Grounding Layers」を有効にし、「Ground Layers」に他のキャラクターレイヤーが含まれないようにします。 また、「Collision Layers」に他のキャラクターレイヤーも含まれないようにする必要があります

私の両方のアクターの「Grounding Layers」と「Collision Layers」にはこれらのレイヤーが含まれていないため、衝突しません。

管理人

ハンドルネーム:タケハタ
本名:波田野剛望(はたのたけみ)

お絵描きとゲームが好きなオス。
2020年の目標は、スチームでゲームをリリースすること。