のぼるゲーム開発備忘録

ゲーム開発のプログラマーです。ゲーム開発関連、調べた内容をアップしていきます。Unityを使用して個人開発を行っています。

【Unity】【Corgi Engine】オリジナル武器の作成①銃の設定調査

f:id:ikeball:20210124144015p:plain

はじめに

CorgiEngineの武器処理は奥が深いです。それでも好きな弾道で発射できるようしたく調査しています。調査項目が多いため何回かの記事に分けてまとめています。今回は銃の設定についてまとめました。

使用アセット

Corgi Engine - 2D + 2.5D Platformer

作業環境

Unity 2019.4.16f1

公式ドキュメントの場所(英語)

Weapons | Corgi Engine Documentation

デモの構成確認

プレイヤーが初期装備をしているデモCorgi3DxTheHuntで武器の扱いを確認しました。

Assets/CorgiEngine/Demos/Corgi3D/Corgi3DxTheHunt

f:id:ikeball:20210122065402p:plain

装備している武器はマウスクリックで発射します。

f:id:ikeball:20210122082131g:plain

このプレイヤーはSoldier3DRedというプレハブで

Assets/CorgiEngine/Demos/TheHunt/Prefabs/PlayableCharactersにあります。

f:id:ikeball:20210122082312p:plain

Soldier3DRed のプレハブを開き、ノードトップを選択しInspectorを下にスクロールし、Character Handle WeaponのパラメータWeapon/Initial Weaponが初期装備のプレハブになります。 

f:id:ikeball:20210122083241p:plain

Character Handle Weapon

スクリプトのパラメータですがとても数が多いです。確認して分かるくらいで、覚える必要はないと感じています。

Permissions

CharacterAbility共通のパラメータ、条件を満たしたときに武器が持てるようになる等の場合に変更します。

Ability Permitted

 true このアビリティは有効。false このアビリティは無効。
Blocking Movement States

 特定の行動状態でアビリティを無効化する場合に設定します。ジャンプ中は攻撃できないようにする場合は、この配列にジャンプ状態を設定します。
Blocking Condition States

 特定ステータス状態でアビリティを無効化する場合に設定します。死亡状態の場合に攻撃できないようにする場合は、この配列に死亡状態を設定します。

Weapon

初期装備は空にして拾って装備するといった事もできます。落ちている装備を拾えないキャラの実装も可能です。

Initial Weapon

 初期装備武器
Can Pickup Weapons

 落ちている装備を拾えるかどうか

Binding

Weapon Attachment

 武器が取り付けられる位置を指定します。空の場合はこのスクリプトが付いているオブジェクトが対象
Force Weapon Scale Reset On Equip

 trueの場合、装備時に武器のScaleを1,1,1,1にする。小さく配置していた武器を元のサイズに戻す場合などに使用します。
Automatically Bind Animator

 trueの場合、このアニメーターは自動的に武器にバインドされます。
Ammo Display ID

 UIの更新対象となる関連番号を設定します。

ContinuousPress

 trueの場合、押しっぱなしでも自動リロードされます。
Getting Hit Interrupts Attack

 ダメージを受けた際に攻撃を中断するかどうか (装備武器のInterruptableがtrueの場合有効)
Can Shoot From Ladders

 梯子に登ってる際に攻撃できるか
Face Weapon Direction

 trueの場合、キャラクターは現在の武器の方向を強制的に向くようになります。

Buffering

Buffer Input

 攻撃入力をバッファリングするかどうかを指定することで、別の攻撃が実行されている間に攻撃を準備できるようにし、コンボしやすくできます。
New Input Extends Buffer

 trueの場合、新しい入力があるたびに受付時間が延びます。
Maximum Buffer Duration

 バッファの最大持続時間を秒単位で指定します。

Debug

Current Weapon

 現在装備されている武器

Feedbacks

Ability Start Feedbacks

 使用時のフィードバック
Ability Stop Feedbacks

 停止時のフィードバック

SoldierMachineGun

武器プレハブSoldierMachineGunを確認しました。

Assets/CorgiEngine/Demos/TheHunt/Prefabs/Weapons/SoldierMachineGun

f:id:ikeball:20210123045226p:plain

SoldierMachineGunプレハブの構成

SoldierMachineGun ... トップノード。主要なスクリプトはここに設定されている。

LeftHandHandle ... 左手位置

MachineGunShells ... 薬莢パーティクル

MachineGunFlames ... ノズルファイヤ(玉発射時にノズルに出るエフェクト)

MachineGunModel ... 銃のモデル

RightHandHandle ... 右手位置

WeaponStartFeedback ... 発射時のフィードバック。SEが設定されている。

WeaponUsedFeedback ... 使用中のフィードバック。SE, Flash, Bloom, Particle様々設定されている。

WeaponStopFeedback ... 停止時のフィードバック。SEが設定されている。

f:id:ikeball:20210123050004p:plain

SoldierMachineGunプレハブのスクリプト

4つのスクリプトが設定されています。

武器の発射間隔や装弾数に関わる重要なところなので詳しく調査しました。

f:id:ikeball:20210123051953p:plain

変更前の動き

f:id:ikeball:20210123064612g:plain

Projecttile Weapon

General Settings

f:id:ikeball:20210123064510p:plain

Trigger Mode

 Auto ボタン押しっぱなしで打ち続ける

 Semi Auto ボタン1度につき一発発射

DelayBeforeUse

 Trigger ModeがAutoの時専用(Semi Autoでは弾が出なくなります)ボタンを押し続けていると、この時間待ってから発射されるようになる。

DelayBeforeUseReleaseInterruption

 trueの場合、ボタンを離すとディレイ時間がクリアされます。falseの場合、ボタンを離しても合計押時間が越えたら弾が発射されるようになります。
TimeBetweenUses

 Auto発射時の発射間隔。Semi Autoの場合連打するとこの時間以下でも発射できます。
TimeBetweenUsesReleaseInterruption

 trueの場合、ボタンを離すと発射間隔時間がクリアされます。falseの場合、ボタンを離しても合計発射間隔時間が越えたら弾が発射されるようになります。
Interruptable

 ダメージを受けた際に攻撃が中断されるかどうか。CharacterHandleWeapon 側のGettingHitInterruptsAttackもtrueになっている場合有効になる。
InitializeOnStart

 trueの場合、武器の起動時に自身で初期化を呼び出すか。設定しない場合、CharacterHandleWeaponクラス等から手動で初期化する必要があります。とあるのですが特に設定しなくても大丈夫そう?

f:id:ikeball:20210123064953g:plain

・Trigger Mode = Semi Auto、ボタンを押すたびに一発発射

f:id:ikeball:20210123070400g:plain

・Trigger Mode = Auto, Time Between Used = 0.05の設定、押しっぱなし

Magazine

f:id:ikeball:20210123115939p:plain

マガジン設定を行うと、一定の発射ごとに弾の詰め直しが必要になります。

MagazineBased

 この武器がマガジンタイプの武器であるか。falseの場合、弾薬はグローバルプールで管理されます。

MagazineSize

 マガジン容量です。

AutoReload

 自動でリロードが行われるかどうか。デフォルトのリロードキーは「R」です。

ReloadTime

 リロードにかかる時間です。

AmmoConsumedPerShot

 1発射ごとに消費される弾数です。

AutoDestroyWhenEmpty

 trueの場合、弾薬が空になった場合武器が自動で破壊されます。

装備インベントリ内含め、弾薬0の状態で破棄されます。弾薬が無限設定の場合は破棄されることはありません。

AutoDestroyWhenEmptyDelay

 AutoDestroyWhenEmptyで破棄されるまでの遅延時間です。

CurrentAmmoLoaded

 現在、装填されている弾数です。

f:id:ikeball:20210123122137g:plain

Magazine Based = true, Magazine Size = 2, Auto Reload = true,
Reload Time = 1, Ammo Cuonsumed Per Shot = 1、発射ボタン連打

Position

f:id:ikeball:20210123122741p:plain

WeaponAttachmentOffset

 モデル表示位置を修正する値です。

FlipWeaponOnCharacterFlip

 キャラクターの判定に合わせて、武器のモデルも反転するかどうか。

FlipValue

 反転時にモデルのtransformのローカルスケールに乗算するため値。通常は -1,1,1,1 ですが、モデルの仕様に合わせて自由に変更できます。

f:id:ikeball:20210123123342g:plain

WeaponAttachmentOffset のyの値を上げて、弾を発射

f:id:ikeball:20210123123741g:plain

FlipWeaponOnCharacterFlip = false

Hands Positions

f:id:ikeball:20210123123938p:plain

LeftHandHandle

 左手を付ける場所

RightHandHandle

 右手を付ける場所

Movement

f:id:ikeball:20210123135632p:plain

ModifyMovementWhileEquipped

 これがtrueの場合、武器が装備されている間の移動力に倍率が適用されます。

PermanentMovementMultiplier

 ModifyMovementWhileEquippedをtrueにすると表示される。

 装備している間の移動力に適用される乗数。

 例として0:装備中は移動ができない。

  0.5:装備中は移動力が半分

  2:装備中は移動力が倍

ModifyMovementWhileAttacking

 これがtrueの場合、武器で攻撃中の移動力に倍率が適用されます。

MovementMultiplier

 ModifyMovementWhileAttackingをtrueにすると表示される。

 攻撃中の移動力に適用される乗数。

PreventHorizontalMovementWhileInUse

 trueの場合、武器で攻撃中の間、横方向の移動が全て無効化されます。

SetForceWhileInUse

 これがtrueの場合、武器で攻撃中の設定された力を受けます。

ForceWhileInUse

 SetForceWhileUseをtrueにすると表示される。

 武器で攻撃中の間受ける力を設定する。

f:id:ikeball:20210123162511g:plain

ModifyMovementWhileAttacking = true, MovementMultiplier = 0.2、右入れっぱなし

f:id:ikeball:20210123162930g:plain

PreventHorizontalMovementWhileInUse = true、右左右と攻撃

f:id:ikeball:20210123163716g:plain

設定変更無のジャンプ攻撃

f:id:ikeball:20210123163831g:plain

SetForceWhileInUse = true, ForceWhileInUse x = 0/y = 0、ジャンプ攻撃

f:id:ikeball:20210123164121g:plain

SetForceWhileInUse = true, ForceWhileInUse x = 0/y = 2、ジャンプ攻撃

f:id:ikeball:20210123164350g:plain

SetForceWhileInUse = true, ForceWhileInUse x = 0/y = 5、攻撃

Animation

f:id:ikeball:20210123141020p:plain

Animators

 この武器が使用されるたびに更新したい他のアニメーター(キャラクター以外の)を設定します。武器の発射タイミングで武器がアニメーションさせる場合など設定を行います。

Animation Parameters Names

f:id:ikeball:20210123141042p:plain

EquippedAnimationParameter

 アニメーションパラメータの名前。この武器が装備されている限り、設定したアニメーターのパラメータをtrueにします。これパラメータ以外はWeaponクラスで更新されますが、このパラメータのみCharacterHandleWeaponで更新が行われます。

IdleAnimationParameter

 アニメーションパラメータの名前。武器を使用していない時true。

StartAnimationParameter

 アニメーションパラメータの名前。武器の使用開始フレームでtrue。

DelayBeforeUseAnimationParameter

 アニメーションパラメータの名前:武器が発射態勢から発射されるまでの間true。

SingleUseAnimationParameter

 アニメーションパラメータの名前: 武器が有効になる(撃つ)各フレームでtrue。

UseAnimationParameter

 アニメーションパラメータの名前:弾を発射してから待機に戻るまでtrue。

DelayBetweenUsesAnimationParameter

 アニメーションパラメータの名前:弾を発射してから待機に戻る際に、武器が使用中の場合true。

StopAnimationParameter

 アニメーションパラメータの名前:弾を発射後、次の発射までの間と、武器使用停止時にtrue。

ReloadStartAnimationParameter

 アニメーションパラメータの名前:武器リロード開始時にtrue。

ReloadAnimationParameter

 アニメーションパラメータの名前:武器リロード中にtrue。

ReloadStopAnimationParameter

 アニメーションパラメータの名前:武器のリロード終了時にtrue。

WeaponAngleAnimationParameter

 アニメーションパラメータの名前:武器の角度。

WeaponAngleRelativeAnimationParameter

 アニメーションパラメータの名前:キャラクターの向きに補正された武器の角度。

Feedbacks

f:id:ikeball:20210123141104p:plain

弾発射時のエフェクトやSE

WeaponStartMMFeedback

 プレイフィードバック:武器の使用開始時

WeaponUsedMMFeedback

 プレイフィードバック:武器使用中

WeaponStopMMFeedback

 プレイフィードバック:武器の使用停止時

WeaponReloadMMFeedback

 プレイフィードバック:武器がリロードされた時

WeaponReloadNeededMMFeedback

 プレイフィードバック:武器がリロードが必要になった時

WeaponOnHitFeedback

 プレイフィードバック:武器が何かに当たった時

WeaponOnMissFeedback

 プレイフィードバック:武器がミスした時(ミスをする武器か、サブクラスごとに設定されている)

WeaponOnHitDamageableFeedback

 プレイフィードバック:ダメージを与えられる武器が当たった時

WeaponOnHitNonDamageableFeedback

 プレイフィードバック:武器がダメージを与えられないものに当たった時

WeaponOnKillFeedback

 プレイフィードバック:武器で誰かを倒した時

Recoil

f:id:ikeball:20210123141125p:plain

ApplyRecoilOnUse

 武器発射時の反動を使用するか。

RecoilOnUseProperties

 ApplyRecoilOnUseをtrueにすると表示される。

 この武器が使われるたびに適用される反動の設定。

 ・Recoil Force Grounded ... 陸にいるときの反動値

 ・Recoil Force Airbome ... 空にいるときの反動値

 ・Recoil Style ... 力のかけ方、加算か代入か

 ・Delay ... 反動の力を受けるまでの待ち時間

 ・Recoil Feedback ... 反動時のフィードバック

ApplyRecoilOnMiss

 武器がミスした時の反動を使用するか。

RecoilOnMissProperties

 ApplyRecoilOnMissをtrueにすると表示される。

 RecoilOnUsePropertiesと同じ。

f:id:ikeball:20210124100909g:plain

ApplyRecoilOnUse = true、攻撃

Projectile Spawn

f:id:ikeball:20210123141146p:plain

ProjectileSpawnTransform

 弾発射位置の基準点として使用するオブジェクト。設定がない場合は武器のトップノードになる。

ProjectileSpawnOffset

 弾を出すオフセット位置。

ProjectilesPerShot

 発射する弾の数。

Spread

 発射する際にばらける角度。

RotateWeaponOnSpread

 発射する角度に合わせて武器を回転させるかどうか。

RandomSpread

 Spreadの拡散をランダムにおこなうかどうか。

SpawnPosition

 確認用。弾を発射するローカル位置。

f:id:ikeball:20210124103016g:plain

ProjectilesPerShot = 3, RandomSpread = false、Spread z = 45、攻撃

f:id:ikeball:20210124103411g:plain

ProjectilesPerShot = 9, RandomSpread = false、Spread z = 180、攻撃

f:id:ikeball:20210124103924g:plain

ProjectilesPerShot = 5, RandomSpread = true、Spread z = 30、上攻撃

Weapon Aim

f:id:ikeball:20210123141218p:plain

AimControl

 エイムの操作方法

 ・Off:制御なし

 ・Primary Movement:一次動作(通常は左スティック)

 ・Secondary Movement:二次動作(右スティック)

 ・Mouse:マウス

 ・スクリプトスクリプトで制御。自作操作システムを作る場合、AIの場合。

RotationMode

 スティック入力でのエイム角度の制限(Mouseモードでは無効)

 ・Free:制限無し

 ・Strict4Directions:4方向限定

 ・Strict8Directions:8方向限定

WeaponRotationSpeed

 武器が新しい入力角度に到達するまでの速度を指定。入力に直接追従した動きをしたい場合は0を設定します。
MinimumAngle

 制限角の下限。これより下の角度はエイムできない。

MaximumAngle

 制限角の上限。これより上の角度はエイムできない。

Reticle

 狙いのレチクル/十字線として表示するゲームオブジェクトを指定します。レチクルを表示したくない場合は空のままにする。

f:id:ikeball:20210124133900p:plain

DisplayReticle

 falseに設定されている場合、レチクルは追加されず表示しない。

ReticleDistance

 レクチルの表示距離。

ReticleAtMousePosition

 trueの場合、レチクルはマウスの位置に配置する。AimControlがMouseの時有効。

RotateReticle

 trueの場合、レチクルは武器の回転に合わせて回転します。

ReplaceMousePointer

 trueの場合、Gameビュー上のマウスカーソルの表示はレチクルに置き換わります。

DisableReticleOnDeath

 破棄時にレチクルを隠すか。

f:id:ikeball:20210124105134g:plain

AimControl = Mouse、マウスで一回転攻撃

f:id:ikeball:20210124110159g:plain

WeaponRotationSpeed = 1、上攻撃

f:id:ikeball:20210124133135g:plain

Aim Control = Mouse, MinimumAngle = -30, MaximumAngle = 30、マウスで一周攻撃

f:id:ikeball:20210124134344g:plain

AimControl = Mouse, ReticleAtMousePostion = true、マウスを動かして攻撃

f:id:ikeball:20210124104425g:plain

WeaponAimスクリプトを無効化

WeaponLaser Sight

f:id:ikeball:20210123141242p:plain

RaycastOriginOffset

 障害物検知用レイキャストの起点位置。この値は良く分からず。

LaserOriginOffset

 レーザーの起点修正位置。

LaserMaxDistance

 レーザーを描画する最大距離。

LaserCollisionMask

 レーザーを停止判断させる衝突レイヤー。

LaserWidth

 レーザーの幅。

LaserMaterial

 レーザーのレンダリングに使用される材料。

f:id:ikeball:20210124135208p:plain

WeaponLaser Sight 上が無効、下が有効

f:id:ikeball:20210124135809p:plain

LaserWidth x = 0.2/y = 0.2

f:id:ikeball:20210124140127p:plain

LaserMaterialの色を変更

MMSimpleObjectPooler

プールとは予め弾のオブジェクトを複数用意し発射の際にプールから取り出すことで、生成にかかる時間を短縮する仕組みです。弾は消滅するとプールに戻ります。

f:id:ikeball:20210123141313p:plain

MutualizeWaitingPools

 これが真の場合、同じ名前のプールが見つかった場合、新規待機プールを作成しないようにします。

NestWaitingPool
 全ての管理オブジェクトをは、空のゲームオブジェクトの下に再グループ化されます。そうでなければ、それらは階層の最上位に配置する。

GameObjectToPool
 管理するオブジェクト。発射する弾のオブジェクトです。

PoolSize
 プールに管理するオブジェクト数。

PoolCanExpand
 true の場合、プールは必要に応じて自動的にオブジェクトを追加します。PoolSize以上の弾が必要となった場合実行中に用意するかどうかの指定です。

f:id:ikeball:20210124141642p:plain

起動時に追加されているこのオブジェクトがプールです。

おわりに

最近記事見ましたよ。ってコメントを頂けるようになって嬉しいです!

今後もアウトプット続けていきたいと思います。次回は別の記事を挟んだのち「オリジナル武器の作成②弾の設定調査」を予定しています。

関連記事

ikeball.hatenablog.com