PDA

View Full Version : Tutorial 照準誤差の組み込み方



Ayaemon
08-02-2011, 08:32 AM
初投稿させて頂きます。

UDKでは初期状態だと、武器使用時にエイムした場所(クロスヘアの中央)に正確に弾を発射します。
ですが、照準誤差(集弾率、命中率、弾のばらけ具合)を組み込みたい場合、
そのままだとできません。
その場合、以下の内容を追加すれば組み込むことができます。

「照準誤差」を英語で何と呼ぶのかよく分からなくて、
調べてもちょうどいい方法が掲載されていなかったので、
私が組み込んだ方法をチュートリアルとして記載しておきます。


Your Weapon Class:


class MyGameWeapon_ClassName extends UTWeapon;

//照準誤差
var bool bSpreadError;
var rotator SpreadErrorMaxRange;

defaultproperties
{
//照準誤差
bSpreadError=true
SpreadErrorMaxRange=(pitch=500,yaw=1000,roll=0)//pitch:縦,yaw:横
}



Your PlayerController Class:


class MyGamePlayerController extends UTPlayerController
dependson(MyGamePlayerReplicationInfo);

function Rotator GetAdjustedAimFor( Weapon W, vector StartFireLoc )
{
local vector FireDir, HitLocation, HitNormal;
local actor BestTarget, HitActor;
local float bestAim, bestDist, MaxRange;
local rotator BaseAimRot;

BaseAimRot = (Pawn != None) ? Pawn.GetBaseAimRotation() : Rotation;

//(Added below)ここから追加:照準誤差
if (MyGameWeapon_ClassName(W) != None && MyGameWeap_AK47(W).bSpreadError)
{
BaseAimRot.Pitch += MyGameWeapon_ClassName(W).SpreadErrorMaxRange.Pitc h * (FRand()-0.5)*2;
BaseAimRot.Yaw += MyGameWeapon_ClassName(W).SpreadErrorMaxRange.Yaw * (FRand()-0.5)*2;
}

FireDir = vector(BaseAimRot);
MaxRange = W.MaxRange();
HitActor = Trace(HitLocation, HitNormal, StartFireLoc + MaxRange * FireDir, StartFireLoc, true);

if ( (HitActor != None) && HitActor.bProjTarget )
{
BestTarget = HitActor;
}
else if ( ((WorldInfo.Game != None) &&(WorldInfo.Game.Numbots > 0)) || AimingHelp(true) )
{
// guess who target is
// @todo FIXMESTEVE
bestAim = 0.95;
BestTarget = PickTarget(class'Pawn', bestAim, bestDist, FireDir, StartFireLoc, MaxRange);
if (W != None && W.GetProjectileClass() == None)
{
InstantWarnTarget(BestTarget, W, vector(BaseAimRot));
}
}

ShotTarget = Pawn(BestTarget);
return BaseAimRot;
}

defaultproperties
{
}


結果:
http://circlemebius.sakura.ne.jp/aya/cg/udkforum001_SpreadError.jpg


範囲を変えたい場合、SpreadErrorMaxRangeの値を変えて下さい。
大きくすればするほど、散らばり具合が広がります。

上記の例は、エイムしている場所を中心に、長方形の中からランダムな場所を選んでいます。
もしもっと散らばり具合を変えたい場合(中央部分に集中させたいとかいう場合)、
GetAdjustedAimFor()の照準計算部分をさらに適した計算値に変更して下さい。

お役に立てて頂ければ嬉しいです。:)

Cool0707
08-10-2011, 12:43 AM
UDKではWeaponクラスに
var() Array<float> Spread;
が定義されてるのでそれをdefaultpropatyで変更すれば「ばらけ」を設定することができますよ 。

Ayaemon
08-10-2011, 08:45 AM
情報ありがとうございます!
おお、Weaponクラスにあったとは。
「照準誤差(ばらけ具合)」は、英語で単純に"Spread"でいいんですね。
勉強になりましたよ。感謝です~。

A0883663
11-07-2011, 11:16 AM
あやえもん氏からの注意点です。
スクリプト内のMyGameWeapon_ClassNameとMyGameWeap_AK47を自分の武 器のクラス名に置き換える必要があるということです。
さすれば、エラーは起きません。