プレイヤーはゲームの中心なので、エンジンにはカスタマイズ可能な機能がたくさん用意されています。
始めるには、BoxCollider2DとPlayerコンポーネントを追加する。
Playerクラスはinput、abilities、world collision設定を処理します。
また、Unityを満足(w)させるためにRigidBody2Dを追加し、Body TypeをKinematicに設定する必要があります。
Method | |
---|---|
BlockInputs(bool value) | trueの場合、プレーヤーの入力をブロックする。 |
Inputs
システムには入力を扱う2つの方法がある。
デフォルトでは、システムはキーボード、マウス、UIボタンで動作する古い入力システムを実装している。
もう1つは、new input systemとのインターフェイスです。
どちらの方法でも、InputButtonSOを使う必要があります。InputButtonSOは、入力を扱う両方の方法のラッパーとして機能するスクリプト可能なオブジェクトです。
InputButtonSO は、Create New Input で入力を作成するたびに自動的に作成され、AssetsFolder/Inputs に配置されます。
UIボタンやその他の類似機能を設定したい場合は、このフォルダを時々参照する必要があります。
システムは「移動」「ジャンプ」「発射」のための共通入力を作成し、「左」「右」「ジャンプ」の入力が常に行われていることを想定しています。
インスペクタに表示されている入力は、InputButtonSOに直接リンクされています。
デフォルトの入力システムの入力には、他の入力にバインド(結びつける)する機能もあります。
例えば、ジャンプ入力が他の入力にバインドされている場合、他の入力がtrueになるたびにジャンプ入力もtrueになります。
入力をバインドするには、下の三角形のトグルをクリックして、入力を追加していきます。
そしてInputButtonSOの参照を設定する必要があります。
これらの入力は、実行中にKeyboardとMouseの値を変更することができ、システムはPlayerPrefsを使用してこれらの変更を自動的に保存します。
新しい入力システムを使用している場合、これは機能しません。

Inputs | |
---|---|
Name and Type | 入力のタイプ。 キーボードかマウスを選び、その値を設定する。 |
Bind Inputs | バインドされた入力への参照。 |
Note
削除ボタンを押すと、プレーヤーの入力リストから入力が削除されます。
削除するには手動で削除する必要があります。
既存の入力をドロップエリアにドラッグ&ドロップすることもできます。
InputButtonSO | Methods |
---|---|
ButtonPressed() | 押された入力が真に設定される。 |
ButtonHold() | 入力ホールドが真に設定される。 |
ButtonReleased() | 入力がリリースされた場合はtrue、入力がホールドされた場合はfalseに設定される。 |
Holding() | 入力が保持されている場合はtrueを返す。 |
Pressed() | 入力が押された場合にtrueを返す。 |
Released() | 入力がされていなければtrueを返す。 |
OverrideKeyboardKey (KeyCode newKey) | キーボードのキーを上書きする。 |
OverrideMouseKey (int newKey) | マウスキーを上書きする。 1=左. 2=右. 3=中央. |
また、いくつかのプレイヤーアビリティには、ボタントリガーという設定があることにお気づきでしょう。この設定により、入力がいつ true になるかを選択できます。
- On Hold (ホールド時)
- On Press (押下時)
- On Release (リリース時)
- Always (常に)
- Never (常にtrueにならない)
- Active (アクティブ)
AlwaysとNeverは主にAI武器に使用されます。
Neverに設定すると、プレイヤーの入力によって武器が誤って発射されるのを防ぐことができます!
Activeは、メソッド呼び出しによって入力がHoldまたはPressされていることを意味します。
それ以外の場合は、Hold、Press、Releaseを使用します。
new input systemとのインタフェースを使うために、まだインストールされていない場合は、Packet Managerからパッケージをインストールしてください。
デフォルトでは、Flare Engineは古い入力システムを使うので、それを無効にするとエラーが出ます。
そこで、Project Settings/Player で Active Input Handling を Both に設定してください。
次に、PlayerのgameobjectにPlayer Inputコンポーネントを追加し、InputActionAssetへの参照を設定します。
Demo1にはすでにこの設定があり、Demo/Assetsフォルダにこのアセットがあります。このアセットには、一般的なコントローラにマッピングされたデフォルト値がいくつか含まれています。
しかし、コントローラによってはデフォルト設定が機能しない可能性がまだ十分にあり、その場合はInputActionsを開いて特定のコントローラ入力をバインドする必要があります。
その場合は、InputActionsを開き、特定のコントローラの入力をバインドする必要があります。このプロセスに慣れるには、Unityのドキュメントを参照する必要があります。
次に、Player InputでBehaviorをInvoke Unity Eventsに
設定します。アクションマップと同様に、イベントフォルダアウトを開きます。今回はPlayerとします。そして、InputButtonSOをこれらのイベントに接続し、以下のメソッドを呼び出します。
New Input System | Methods |
---|---|
InputPerformed() | 押された入力がtrueに設定される。 |
InputPerformedHold() | 入力ホールドがtrueに設定される。 |
InputCancelled() | 入力がリリースされた場合はtrueに設定され、入力がホールドされた場合はfalseに設定される。 |

例えば、ボタンが押された時に入力を動作させるには、ジャンプ入力から InputPerformed()を呼び出します。
しかし、方向キーのようにボタンを押したままにするような場合は、InputPerformedHold()とInputCancelled()の両方を呼び出します。
場合によっては、希望する効果を得るために3つのメソッドすべてを呼び出すこともあります。この設定を完了すると、新しい入力システムがこれらのメソッドを呼び出すようになります。
Priority
プレイヤーが複数のアビリティを有効にしている場合、優先順位を割り当てる必要があります。つまり、2つ以上のアビリティが同時にアクティブになった場合、優先順位の高いアビリティが実行され、他のアビリティはキャンセルされます。これは厄介な状況を防ぐためです。
たとえば、プレイヤーが壁を登っているとき、銃器を撃つアビリティを持っていてはいけません。この場合、射撃アニメーションが壁の保持を考慮していないと、奇妙に見えます。
プライオリティ・システムを使えば、これを防ぐことができます。

しかし、アビリティの共存が必要な場合もあります。
システムはこのような状況のために例外を実装しています。
どのアビリティも例外を追加することができ、それによって指定されたアビリティを同時に実行することができる。
たとえば、プレイヤーが銃器を撃つとき、「銃器」アビリティに例外として「ジャンプ」アビリティが含まれていなければ、プレイヤーは弾丸の発射とジャンプを同時に行うことができません。これを解決するには、Firearmsの優先順位にJumpの例外(Exception)を追加します。
優先順位を設定するには、優先順位のブロックをドラッグするだけです。
1番目が最優先です。
Tip
PushBackアビリティを使用する場合、最優先に設定することをお勧めします。そうすれば、プレイヤーがダメージを受けたとき、壁を登るなど、現在使用しているアビリティから離脱します。
Settings
Property | |
---|---|
Gravity, Jump | ジャンプの高さとジャンプ時間によって重力の値が決まる。これらの値はジャンプ力にも反映される。 |
Gravity Multiplier | プレイヤーのy方向の速度が負のとき、重力の力を調整する。 |
Terminal Velocity | プレイヤーの最大落下速度。 |
Rays | キャラクターからワールドを検出するために水平方向と垂直方向に伸びるrAYCASTの数。 効率化のため、この数値は低くしておきます。 |
Climb Slopes | 有効にすると、キャラクターは最大斜度以下の斜面を登ることができるようになります。 |
Rotate To Slope | 有効にすると、キャラクターは地面と垂直になるように回転率に従って回転します。 |
Rectify In Air | 有効にすると、キャラクターが回転しながらジャンプして、スクエアなポジションに回転する。 |
Jump Through 2D Edge | 有効にすると、ジャンプボタンを押し続けなくても、キャラクターは自動的にエッジコライダー2Dをジャンプする。 |
Check Corners | 有効にすると、プラットフォームのコーナーがキャラクタの側面に入り込んでいるかどうかをチェックし、それを防ぎます。 Climb Slopes(斜面を登る)が有効になっている場合、キャラクタの底を通るコーナーがないか自動的にチェックします。 |
Use Bridges | 有効にすると、キャラクターは橋の上を歩けるようになります。 |
Use Moving Platforms | 有効にすると、キャラクターはムービングプラットフォームとインタラクションできるようになる。 |
Collide With World Only | システムはワールドとプラットフォームの両方の衝突をチェックする。これを有効にすると、Worldの衝突のみをチェックします。 |
Use Late Update | AIのみ。 有効にすると、Updateの代わりにLate Updateが実行されます。 |
Crushed By Platform | キャラクタが2つの硬い面の間で押しつぶされたときに呼び出されるUnityイベント。これは、キャラクタが動いているプラットフォームの上に立っているか、またはプラットフォームを持っていて、硬い表面上に移動されたとき、またはキャラクタが硬い表面に押し込まれたときに発生します。 このイベントは通常、キャラクタの死を意味し、キャラクタの位置をリセットする必要があります。 ダイナミックアクティブメソッドでワールドエフェクトを呼び出します。 |
Edge Collider 2D
EdgeCollider2Dを含むプラットフォームを扱う場合、ジャンプボタンが押されていれば、キャラクターはプラットフォームをジャンプして通り抜けることができます。そうでない場合、システムはプラットフォームを天井として解釈します。下ボタンが押されている場合、キャラクタはプラットフォームから飛び降りることができます。もちろん、これはジャンプとダウンの入力が同時の場合にのみ機能します。
Ability
赤いボタンをクリックして、アビリティをシステムに追加します。
どのアビリティも、そのコンポーネントから Pause メソッドを呼び出すことで一時停止できます。
便宜上、各アビリティは開発中にインスペクタで一時停止できます。
Creating An Ability
エンジンがまだ提供していない場合は、ユニークな能力を作成します。
以下のテンプレートに従ってください。
using UnityEngine;
namespace TwoBitMachines.FlareEngine.ThePlayer
{
public class Ability : MonoBehaviour
{
// None of the methods below are required. Use them as necessary
public override void Initialize (Player player)
{
// Initialize variables here. This is called in Awake.
}
public override void Reset (AbilityManager player)
{
// Reset important variables here.
}
public override bool TurnOffAbility (AbilityManager player)
{
// This is called when a higher priority ability overrides this one.
// Reset important variables. Usually the Reset method is called here.
// Return false if this ability is doing an important task that can't be cancelled.
// For example, the crouch ability can't be cancelled unless the player has enough
// head room to fully stand up. Return true if it can be cancelled.
return true;
}
public override bool IsAbilityRequired (AbilityManager player, ref Vector2 velocity)
{
// This is where the system checks if the ability has become active. Some condition
// will go true, usually a button is pressed, in which case return true.
return false;
}
public override void ExecuteAbility (AbilityManager player, ref Vector2 velocity)
{
// Place the code that executes the ability here. This is only called if the ability
// is active.
}
public override void EarlyExecute (AbilityManager player, ref Vector2 velocity)
{
// This is always called before ExecuteAbility. Sometimes it's necessary to execute
// code before anything else. The ability itself shouldn't execute here. However,
// if the ability is simple enough and always needs to run, execute the ability here.
// The Ground ability functions this way. If doing this, just make sure the ability
// won't interfere with any other abilities.
}
public override void LateExecute (AbilityManager player, ref Vector2 velocity)
{
// This is always called after ExecuteAbility. Firearm ability uses it to apply
// recoil to the player.
}
public override void PostCollisionExecute (AbilityManager player, Vector2 velocity)
{
// This is called after all the abilities and collision checks have executed.
// This velocity was the total velocity applied to the player during the frame.
}
}
}
// The AbilityManager has many variables to be aware of.
// player.signals -- set relevant signals: player.signals.Set ("signalName")
// player.world -- read if player is onGround, onSlope, onMovingPlatform, etc
// player.inputs -- read button inputs: player.inputs.Pressed("buttonName"), etc
// player.maxJumpVel -- the maximum jump force
// player.onSurface -- set true if the player should be standing on a surface. Bridge uses this
// player.jumpButton -- read if the jump buttons have been pressed
// player.hasJumped -- set true if the ability made the player jump
// player.gravity.gravity -- the value of gravity
// player.checkForAirJumps -- set true if the ability made the player jump
// player.playerDirection -- the direction of the player in the x-direction