メインコンテンツまでスキップ

AchMover

AchMoverは、アタッチするだけで即座に動作する2Dキャラクター移動コンポーネントです。 Rigidbody2Dを使用しません — 独自の衝突処理(Move-and-Slide)、重力、傾斜、階段、地面スナップをすべて自前で実行します。 必要なコンポーネントはCapsuleCollider2Dひとつだけで、自動的に追加・管理されます。

使い方

キャラクターのGameObjectにAch Moverコンポーネントを追加するだけです。

モード操作
PlatformerA / D で左右移動、Space / W / でジャンプ
TopDownWASD / 矢印キーで上下左右移動

New Input System 完全対応 — Player SettingsでInput System Packageに切り替えても自動的にKeyboard.current / Gamepad.current経由で動作します。

同じGameObjectにRigidbody2Dが存在する場合、transform移動と衝突するため自動的にsimulated = falseに設定されます。

Inspector

Movement

フィールドデフォルト値説明
MoveSpeed5移動速度 (Units/sec)
JumpForce12ジャンプ力 (UseGravity = true 専用)
ModePlatformerPlatformer / TopDown

Physics

フィールドデフォルト値説明
UseGravitytrue重力・地面検出の有効/無効
GravityScale3重力倍率
FallMultiplier2落下時の追加重力倍率 — 大きいほど重い感触
MaxFallSpeed20最大落下速度

Slopes & Stairs

フィールドデフォルト値説明
MaxSlopeAngle50°登れる最大傾斜角度。これを超える表面は壁として扱われ滑り落ちる
StepHeight0.3自動で登れる階段・段差の最大高さ (Units)

Control

フィールドデフォルト値説明
Movabletruefalseの場合は入力を遮断し、コードからのみ制御可能
FlipSpritetrue移動方向に応じてtransform.localScale.xを反転 — 子オブジェクト(武器、エフェクト、ヒットボックスなど)も一緒に反転

独自の衝突システム

AchMoverは毎FixedUpdateで以下の手順を実行します。

  1. 速度計算 — 入力、重力、ジャンプを総合して当該フレームの速度を決定
  2. Move-and-SlideCapsuleCollider2D.Castで進行方向を検査し、衝突面に沿ってスライド。最大4回繰り返しでコーナーや複数面を処理
  3. 階段の自動昇り — 壁に阻まれた際、StepHeight以内の段差なら自動的に登る(持ち上げ → 横移動 → 下ろす)
  4. 地面判定 — コライダーの下に向けてカプセルキャストし、表面角度がMaxSlopeAngle以下ならgrounded
  5. 地面スナップ — 斜面を下る際に表面から離れないように再度密着させる
  6. ペネトレーション補正 — 最後に残った重なりを確認して押し出す

状態プロパティ

bool isGrounded = mover.IsGrounded; // 地面に接地しているか (UseGravity = true 専用)
bool isMoving = mover.IsMoving; // 現在移動中か (入力ベース)
Vector2 velocity = mover.Velocity; // 現在の速度
Vector2 groundNormal = mover.GroundNormal; // 足元表面の法線 (なければ Vector2.up)

ジョイスティック / カスタム入力の接続

// オンスクリーンジョイスティックを接続
mover.InputProvider = () => joystick.Direction;

// 解除 (キーボード入力に戻す)
mover.InputProvider = null;

コード制御 API

Movableの値に関わらず、いつでも呼び出すことができます。

mover.Jump(); // ジャンプ (UseGravity = true 専用)
mover.Teleport(new Vector2(10f, 0f)); // テレポート
mover.SetVelocity(new Vector2(-5f, 4f)); // 速度を直接設定 (ノックバックなど)
mover.AddForce(Vector2.left * 10f); // Impulse形式で速度に加算
mover.Stop(); // 即時停止

Rigidbody2Dがないため、AddForceは常に即座に速度へ加算されるImpulseとして動作します。forceMode引数は互換性のために残っていますが無視されます。

ノックバックの例

mover.Movable = false;
mover.SetVelocity(new Vector2(-6f, 5f));
await Task.Delay(400);
mover.Movable = true;

UseGravity の組み合わせ

ModeUseGravity動作
Platformertrue重力 + ジャンプ + 傾斜 + 階段、左右移動
Platformerfalse重力なし、左右移動のみ(垂直方向は自由)
TopDownfalse重力なし、4方向自由移動
TopDowntrue4方向移動 + 自由落下(特殊なケース)

AchFollower — AI 追跡

AchFollowerは指定したターゲットに向かって移動する独立したコンポーネントです。 AchMoverとはまったく関係なく、どのGameObjectにも単独で使用できます。

フィールドデフォルト値説明
Targetnull追跡対象のTransform
MoveSpeed5移動速度 (Units/sec)
StopDistance0.5この距離以下になると停止
// ターゲット設定
follower.SetTarget(player.transform);

// ターゲット解除
follower.ClearTarget();

transform.positionを直接移動します。

A*経路に沿った高度な移動については、A* 経路探索 ドキュメントを参照してください。

AchProjectile — 発射体

直進、誘導など多様な発射体を1つのコンポーネントで管理します。 InspectorのTypeドロップダウンで方式を選択すると、関連するフィールドのみ表示されます。

共通フィールド

フィールドデフォルト値説明
TypeStraight発射体の移動方式
MoveSpeed10移動速度 (Units/sec)

Type別フィールド

Typeフィールドデフォルト値説明
StraightDirectionVector2.right初期移動方向
HomingTargetnull追跡対象のTransform
HomingTurnSpeed180秒間最大旋回角度(度)
// 発射方向設定 (Straight・Homing共通)
projectile.Launch(Vector2.right);

// 誘導ターゲット設定 / 解除 (Homing)
projectile.SetTarget(enemy.transform);
projectile.ClearTarget();

ターゲットを失ったHoming発射体は、最後の進行方向に直進し続けます。

トリガー/衝突イベント

Rigidbody2Dがないため、このGameObjectから直接OnCollisionEnter2Dは発生しません。 OnTriggerEnter2D相手側のトリガーにRigidbody2Dがあれば正常に動作します(多くのトリガーゾーンはKinematic Rigidbody2D + Triggerで構成すれば問題ありません)。