Results 1 to 4 of 4
  1. #1

    Default 照準誤差の組み込み方

    初投稿させて頂きます。

    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
    {
    }
    結果:



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

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

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

  2. #2

    Default

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

  3. #3

    Default

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

  4. #4

    Default

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


 

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Copyright ©2009-2011 Epic Games, Inc. All Rights Reserved.
Digital Point modules: Sphinx-based search vBulletin skin by CompletevB.com.