概要
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のスケルトンメッシュを開いてプロパティをメモして、設定を自作銃に移植していきます。
インゲームテスト
VIDEO
マズルフラッシュ
マズルフラッシュが出ていないので修正します。
.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
VIDEO
アニメーションの追加
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.uc でWeaponIdle に設定されています。
ちなみこのやり方と同じ方法で、ズーム中とそうでない時の弾のバラケ具合を変えたり、歩くスピードを変えたりいろいろ出来ます
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);
}
}
リロードアニメーションはWeaponIdleAnims とArmIdleAnims を切り替える事によって実装しています。切り替えるだけではアニメーションが更新されないので、一度再生して更新する必要があります。
最終更新:2010年01月08日 21:50