新規武器作成

概要

LightWaveでAK74を作成してみます。

参考リンク

メッシュの作成

まずモデラーを立ち上げてLinkGunのメッシュを開き、それを大まかな目安にします。

次にそれを目安に大まかなパーツを作ります。

そしてUVを展開します。

tips:ディテールを付けるのはインゲームでアニメーションを確認してからにしましょう。

ウェイトの作成

ボーン割り当ての前準備としてポリゴンにウェイトを割り当てて行きます。


ボーンの作成

ここからレイアウトでの作業になります。
まず全体の親になるボーン「LG」を通します

次にLGの子ボーンに「LG_~~~」という名前で各パーツに子ボーンを通していきます。
次にLGの子ボーンとして「LG_flash」をマズルフラッシュの位置に置きます。ここにマズルフラッシュのエフェクトが発生します

以上でボーン通しは完了です。

アニメーションの作成

ここからはUDKを立ち上げて、LinkGunのアニメーションの情報を調べながら作業ていきます。
K_WP_LinkGun_1P_Baseを開いて、アニメーションタブの情報を見ます。


tips:アニメーションシーケンスの欄でアニメーション名や各アニメーションのフレーム数が分かります。

K_WP_LinkGun_1P_Baseのアニメーションを参考に、自作銃にアニメーションを付けていきます。

まず一番上のWeaponAltFireを作ります。
WeaponAltFireは12フレームなので、レイアウトの総フレーム数を11に設定してWeaponAltFire用のキーフレームを作成します。(フレーム数には0も含まれますので0~11で12フレームです)

次に総フレーム数を23に設定して12から23の間にWeaponAltEndのアニメーションを作成します。

同じ要領で7つのアニメーションすべてを作成します。

モデル&アニメーションの出力

エクスポーターを画像の様に設定してスケルトンメッシュ(PSK)とアニメーション(PSA)を出力します。


tips:エクスポートする前にポリゴンを綺麗にしておかないとメッシュが正常に出力されません。すべて3頂点ポリゴンにしておきましょう。


UDKエディタへの取り込み

まずコンテンツブラウザでPSKファイルを取り込みます。

次に新規アニメーションセットを作成します。


次に骨格メッシュに先ほどインポートしたメッシュを選択し、左上メニューのファイルからPSAをインポートを実行します。



インポートが成功すると7つのアニメーションが取り込まれます。

マテリアルインスタンスの割り当て

テクスチャを取り込み、マテリアルを作成し、マテリアルインスタンスを作成し、マテリアルインスタンスをスケルトンメッシュに適用します


完了したらパッケージを保存してUDKを閉じてからコーディング作業に移ります。

コーディング UTWeap_AK74.uc

1、まず、UTWeap_LinkGun.ucをコピーしてUTWeap_AK74.ucを作成します
LinkGunのコードをベースにする理由は、アニメーション的な設定をしなくてすむからです。

2、UTWeap_AK74.ucを開き、まずクラス名をUTWeap_AK74に変更し、
次にスケルトンメッシュやアニメーションセットを変えます。

	SkeletalMesh=SkeletalMesh'WP_LinkGun.Mesh.SK_WP_Linkgun_1P'
	AnimSets(0)=AnimSet'WP_LinkGun.Anims.K_WP_LinkGun_1P_Base'


	SkeletalMesh=SkeletalMesh'WP_AK74.Mesh.SK_WP_AK74_1p'
	AnimSets(0)=AnimSet'WP_AK74.Anim.K_WP_AK74_1p_Base'

3、次に発射される弾頭を変えます。

        UTProj_LinkPlasma


        UTProj_AK74

弾頭ファイルの作成については弾頭の作成をご覧ください。


4、最後にCtrl+Hですべての「UTWeap_LinkGun」を「UTWeap_AK74」に変更します。
tips:変更しないとクラス名が本物LinkGunのと被るのでType mismatch in '='のエラーが出ます。

コーディング UTGame.uc

UTWeap_AK74のファイルは作成しましたが、このままではインゲームで確認できないのでUTGame.ucを弄ってデフォルトの銃をUTWeap_AK74に変更します。

DefaultInventory(0)=class'UTWeap_LinkGun'


DefaultInventory(0)=class'UTWeap_AK74'

各種修正

UDKエディタを立ち上げて各種修正を行っていきます。

1、まず、キャラクタのスケルトンメッシュを開いて追加するメッシュで自作銃とLinkGunを追加してみて大きさや角度について見てみます。


今回の場合大きさは問題ないみたいですが、角度がおかしいので修正をします。

2、LinkGunのスケルトンメッシュを開いてプロパティをメモして、設定を自作銃に移植していきます。

インゲームテスト


マズルフラッシュ

マズルフラッシュが出ていないので修正します。
.ucファイルを見ると

EffectSockets(0)=MuzzleFlashSocket
EffectSockets(1)=MuzzleFlashSocket

となっているのでソケットを作成します。

1、自作銃のスケルトンメッシュを開いて、メニューバーからソケットマネージャーを選択します


2、新規ソケットを実行し、ボーンを「lg_flash」を選択して、ソケット名を「MuzzleFlashSocket」と入力します。




これでマズルフラッシュが発生する様になりました。

セカンダリウェアポンの変更

LinkGunのセカンダリはビーム(UTProj_LinkPowerPlasma)になっているので、これをアイアンサイトに変えます。

UDKの武器に右クリック武器がズームインになっている物はないので今回はUT3からコードを持ってきます。(UDKでUT3のコードを使った物をリリースするのはNGですがリリースしない個人使用の範囲なら問題ないと思われます)

UT3の武器だとUTWeap_SniperRifle.ucがそれっぽいの今回はこの武器をベースにします。

1、自作銃のデフォルトプロパティにズーム用の設定を書きます

   bDisplayCrosshair=True
   ZoomLoopCue=SoundCue'A_Weapon_AK74.AK74.A_Weapon_AK74_ZoomLoop_Cue'
   FadeTime=0.300000
   //入力受付
   bZoomedFireMode(0)=0
   bZoomedFireMode(1)=1
   //ズーム出来る最大のFOV、数字が小さい程遠くまでズームする
   ZoomedTargetFOV=50.000000
   //ズームする早さ
   ZoomedRate=500.000000


アニメーションの追加

UTWeap_SniperRifleにはズーム用のアニメーションが3つ設定されているのでまずこれらを作成し、自作銃のAnimSetに追加します。

次に自作銃のコードを変更してアニメーションの再生を設定します。
追加するコードは細かく書きませんがUTWeap_SniperRifleのコードをそのままコピーすれば動きます。

ズーム中アイドルのアニメーションの切り替え

UTWeap_SniperRifleはスコープのDrawZoomedOverlay(HUD)が表示される設定になっていますが、今回の自作銃はアイアンサイトなのでDrawZoomedOverlay(HUD)の部分は削ります。

しかし削っただけではズームしている時でも普通のアイドル用アニメーションのWeaponIdleAnims(0)が再生されてしまうので、ズーム時はズーム用のアニメーションを再生する様に設定します。

1、まずsimulated function StartZoom(UTPlayerController PC)の所に

WeaponIdleAnims[0] ='WeaponZoomIdle';

を追加し、

次にsimulated function LeaveZoom()に所に

WeaponIdleAnims[0] ='WeaponIdle';

を追加します。

これで、ズームしたタイミングでIdleアニメーションが変わり、ズームから出た時に普通のIdleに戻ります。

Tips:WeaponIdleAnims[0]のデフォルトプロパティは親クラスのUTWeapon.ucWeaponIdleに設定されています。


ちなみこのやり方と同じ方法で、ズーム中とそうでない時の弾のバラケ具合を変えたり、歩くスピードを変えたりいろいろ出来ます

1pハンド

デフォルトプロパティにArmsAnimSetを指定する事で手の1pハンドを追加する事が出来ます。

  ArmsAnimSet=AnimSet'WP_Enforcers.Anims.K_WP_Enforcers_1P_Arms'

アニメション名はUTWeaponのデフォルトでは

ArmFireAnim(0)=WeaponFire
ArmFireAnim(1)=WeaponFire
ArmsPutDownAnim=WeaponPutDown
ArmsEquipAnim=WeaponEquip
ArmIdleAnims(0)=WeaponIdle

以上の5つが用意されています。
今回はこれにズーム用のアニメションを4つ追加し、自作銃のucコードにも再生する様に書き入れます。。

WeaponZoomIn
WeaponZoomOut
WeaponZoomIdle
WeaponZoomFire


マガジン制とリロード

UDKの武器はマガジンという概念がなくてリロードもないのでそれを追加します。
まずUT3を探すとUTWeap_Avril.ucにリロードがあるとと分かったのでその処理を参考にします。

マガジン&リロード その1

まず武器のucに変数とデフォルトプロパティを設定します。
var int InClipCount;  //マガジン内の弾数、整数
var int MaxInClipCount;  //マガジン内の最大数、整数
var int AmmoCount;  //弾薬の数
var int MaxAmmoCount;  //弾薬の最大数
var float Reloadtime;  //リロードに掛かる時間
var bool bReloading; //リロード中かどうか
var SoundCue ReloadSnd;  //リロードサウンド
var name WeaponReloadAnim;

DefaultProperties
{
	InClipCount=30
        MaxInClipCount=30
	AmmoCount=150
    MaxAmmoCount=150
	Reloadtime=4
	ReloadSnd=SoundCue'None'
	bReloading=false
	ShotCost(0)=0
	ShotCost(1)=0
}

ShotCostは発射毎のAmmoCountの消費量です。
デフォルトは1になっていますが、今回はAmmoCountの変わりにInClipCountを使うのでShotCostは0にします。

マガジン&リロード その2

まずリロードの処理について考えてみます。リロードの処理はReloadStartとReloadEndの2つに分ける事が出来ます。

まずReloadStartの処理は以下になります
  リロードアニメーションの再生
  サウンドキューの再生
  現在のAmmoCountを0に設定
  リロードタイムの計測開始
  

次にReloadEndの処理は以下になります
  AmmoCountを-30
  InClipCountにMaxInClipCountを足す

次にそれぞれの処理が始まる条件を考えて見ます。
ReloadEndは単純で、リロードタイムが終わればReloadEndが処理されるようにします。
ReloadStartは、Rキーを押した時とAmmoCountが0になった時にMagazineCountが1以上だった場合処理される様にします。

simulated function InstantFire()
{
	if(InClipCount > 1)
	{
		InClipCount -= 1;
		super.InstantFire();
	}
	else
	{
               StopFire(0);
	       ReloadStart();
	       super.InstantFire();
               bReloading = true;
	}       
} 

simulated function ReloadStart()
{
	//デバックテキストを表示
    WorldInfo.Game.BroadcastHandler.Broadcast(self, "ReloadStart");

	//アイドルアニメーションの切り替え
	WeaponIdleAnims[0]='WeaponReload';
      ArmIdleAnims[0]='WeaponReload';

	//リロードアニメーション再生
	PlayWeaponAnimation('WeaponReload',2.7);
      PlayArmAnimation('WeaponReload',2.7);

	SetTimer (Reloadtime, false, 'ReloadEnd');
}

simulated function ReloadEnd()
{
	AmmoCount -= Maxinclipcount;
	inclipcount += Maxinclipcount;
	bReloading = false;
	WorldInfo.Game.BroadcastHandler.Broadcast(self, "ReloadEnd");
	
	//アイドルアニメーションを元に戻す
	WeaponIdleAnims[0]='WeaponIdle';
        ArmIdleAnims[0]='WeaponIdle';

	//アイドルアニメーションを再生する
        PlayWeaponAnimation('WeaponIdle',2.7);
        PlayArmAnimation('WeaponIdle',2.7);
}

//リロード中に発射を止める
simulated function StartFire(byte FireModeNum)
{
 if(!bReloading)
 {
  super.StartFire(FireModeNum);
 }
}
リロードアニメーションはWeaponIdleAnimsArmIdleAnimsを切り替える事によって実装しています。切り替えるだけではアニメーションが更新されないので、一度再生して更新する必要があります。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年01月08日 21:50
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。