UDN
Search public documentation:

MobileVehicleExampleJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > Mobile ホーム > モバイル ビークルの例

モバイル ビークル (乗り物) の例


2011年3月に UDK について最終テスト実施済み

概要


「Unreal Engine 3」のビークル (乗り物) は、物理シミュレートされたオブジェクトです。プレイヤーは新たなゲームプレイを楽しむことができます。たいていのビークルのタイプ (たとえば、自動車、トラック、戦車、ヘリコプター、飛行機) は、モバイルデバイス上ですべてシミュレートすることができます。UDN ではすでにビークルに関する情報が大量に掲載されています。したがって、このドキュメントでは、例を紹介することにします。

関連テーマ

MobileVehicleGameInfo


このカスタムの GameInfo は、プレイヤーのためのビークルをスポーンします。

MobileVehicleGameInfo.uc
class MobileVehicleGameInfo extends MobileGame;

function RestartPlayer(Controller NewPlayer)
{
  local NavigationPoint StartSpot;
  local int Idx;
  local array<SequenceObject> Events;
  local SeqEvent_PlayerSpawned SpawnedEvent;
  local Vehicle Vehicle;

  if (bRestartLevel && WorldInfo.NetMode!= NM_DedicatedServer && WorldInfo.NetMode!= NM_ListenServer)
  {
    return;
  }

  StartSpot = FindPlayerStart(NewPlayer, 255);

  if (StartSpot == None)
  {
    if (NewPlayer.StartSpot != None)
    {
      StartSpot = NewPlayer.StartSpot;
    }
    else
    {
      return;
    }
  }

  if (NewPlayer.Pawn == None)
  {
    NewPlayer.Pawn = Spawn(class'MobileVehiclePawn',,, StartSpot.Location, StartSpot.Rotation);
  }

  if (NewPlayer.Pawn == None)
  {
    NewPlayer.GotoState('Dead');

    if (PlayerController(NewPlayer) != None)
    {
      PlayerController(NewPlayer).ClientGotoState('Dead', 'Begin');
    }
  }
  else
  {
    NewPlayer.Pawn.SetAnchor(StartSpot);

    if (PlayerController(NewPlayer) != None)
    {
      PlayerController(NewPlayer).TimeMargin = -0.1;
      StartSpot.AnchoredPawn = None;
    }

    NewPlayer.Pawn.LastStartSpot = PlayerStart(StartSpot);
    NewPlayer.Pawn.LastStartTime = WorldInfo.TimeSeconds;
    NewPlayer.Possess(NewPlayer.Pawn, false);
    NewPlayer.ClientSetRotation(NewPlayer.Pawn.Rotation, true);

    SetPlayerDefaults(NewPlayer.Pawn);

    if (WorldInfo.GetGameSequence() != None)
    {
      WorldInfo.GetGameSequence().FindSeqObjectsByClass(class'SeqEvent_PlayerSpawned', true, Events);

      for (Idx = 0; Idx < Events.Length; Idx++)
      {
        SpawnedEvent = SeqEvent_PlayerSpawned(Events[Idx]);

        if (SpawnedEvent != None && SpawnedEvent.CheckActivate(NewPlayer,NewPlayer))
        {
          SpawnedEvent.SpawnPoint = startSpot;
          SpawnedEvent.PopulateLinkedVariableValues();
        }
      }
    }

    NewPlayer.Pawn.SetCollision(false, false, false);
    Vehicle = Spawn(class'MobileVehicleScorpion',,, StartSpot.Location, StartSpot.Rotation);

    if (Vehicle != None)
    {
      Vehicle.TryToDrive(NewPlayer.Pawn);
    }
  }
}

defaultproperties
{
  PlayerControllerClass=class'MobileVehiclePlayerController'
}

MobileVehiclePawn


このクラスが作成された理由は、MobilePawn の中の TickSpecial がコントローラーにアクセスを試み、Access Nones を返していたからです。TickSpecial がスタブ化されて、この警告が出ないようにしています。

MobileVehiclePawn.uc
class MobileVehiclePawn extends MobilePawn;

event TickSpecial(float DeltaTime);

defaultproperties
{
}

MobileVehiclePlayerController


このクラスが作成された理由は、MobilePC の中の PlayerTick が足音を再生していたからです。(運転時の音にはふさわしくありません)。PlayerDriving を変更することによって、PlayerInput.aForward と PlayerInput.aStrafe を使用してビークルを制御するようにしました。理由は、デフォルトの仮想ジョイスティックがこれらの入力変数にマッピングされているためです。

モーション コントロールも追加されたため、プレイヤーがデバイスを傾けてビークルを制御できるようになっています。

MobileVehiclePlayerController.uc
class MobileVehiclePlayerController extends MobilePC;

function PlayerTick(float DeltaTime)
{
  Super(GamePlayerController).PlayerTick(DeltaTime);
}

state PlayerDriving
{
  ignores SeePlayer, HearNoise, Bump;

  function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot);

  function ProcessDrive(float InForward, float InStrafe, float InUp, bool InJump)
  {
    local Vehicle CurrentVehicle;

    CurrentVehicle = Vehicle(Pawn);

    if (CurrentVehicle != None)
    {
      bPressedJump = InJump;
      CurrentVehicle.SetInputs(InForward, -InStrafe, InUp);
      CheckJumpOrDuck();
    }
  }

  function PlayerMove(float DeltaTime)
  {
    local MobilePlayerInput MobilePlayerInput;
    local float Forward, Strafe, MotionPitch;

    UpdateRotation(DeltaTime);

    // Get the forward input information
    Forward = PlayerInput.aForward;
    // Get the strafe input information
    Strafe = PlayerInput.aStrafe;

    // Get the mobile player input
    MobilePlayerInput = MobilePlayerInput(PlayerInput);

    if (MobilePlayerInput != None)
    {
      // Handle the the device's motion values
      // Filter the pitch of the device to give us reasonably good readings
      MotionPitch = MobilePlayerInput.DeviceMotionAcceleration.Z;
      // -0.25f is the default tilt of the ipad
      MotionPitch += 0.25f;
      // Append the forward value
      Forward += MotionPitch * 2.f;
      // Append the strafe value
      Strafe += MobilePlayerInput.DeviceMotionAcceleration.Y * 2.f;
    }

    // Clamp the forward to within -1.f and 1.f
    Forward = FClamp(Forward, -1.f, 1.f);
    // Clamp the strafe to within -1.f and 1.f
    Strafe = FClamp(Strafe, -1.f, 1.f);

    ProcessDrive(Forward, Strafe, PlayerInput.aUp, bPressedJump);

    if (Role < ROLE_Authority)
    {
      ServerDrive(PlayerInput.aForward, PlayerInput.aStrafe, PlayerInput.aUp, bPressedJump, ((Rotation.Yaw & 65535) << 16) + (Rotation.Pitch & 65535));
    }

    bPressedJump = false;
  }

  event BeginState(Name PreviousStateName)
  {
    CleanOutSavedMoves();
  }

  event EndState(Name NextStateName)
  {
    CleanOutSavedMoves();
  }
}

defaultproperties
{
}

MobileVehicleScorpion


このクラスは Scorpion ビークルを表現します。このクラスは、UTVehicle_Scorpion と UTVehicle_Scorpion_Content を集めたものです。簡素化のために SVehicle がベースとして使用されています。

MobileVehicleScorpion.uc
class MobileVehicleScorpion extends SVehicle;

var DynamicLightEnvironmentComponent LightEnvironment;

defaultproperties
{
  Health=300
  COMOffset=(X=-40.f,Y=0.f,Z=-36.f)
  UprightLiftStrength=280.f
  UprightTime=1.25f
  UprightTorqueStrength=500.f
  bCanFlip=true
  bHasHandbrake=true
  GroundSpeed=950
  AirSpeed=1100
  HeavySuspensionShiftPercent=0.75f
  MomentumMult=0.5f
  NonPreferredVehiclePathMultiplier=1.5f
  DrawScale=1.2f
  bAlwaysRelevant=true
  SquealThreshold=0.1f
  SquealLatThreshold=0.f2f
  LatAngleVolumeMult=30.f
  EngineStartOffsetSecs=2.f
  EngineStopOffsetSecs=1.f
  bAttachDriver=false
  BaseEyeheight=30
  Eyeheight=30

  Begin Object Class=AudioComponent Name=ScorpionEngineSound
    SoundCue=SoundCue'MobileVehicleContent.Sounds.ScorpionEngineLoopSoundCue'
  End Object
  EngineSound=ScorpionEngineSound
  Components.Add(ScorpionEngineSound);

  Begin Object Class=AudioComponent Name=ScorpionSquealSound
    SoundCue=SoundCue'MobileVehicleContent.Sounds.ScorpionSlideSoundCue'
  End Object
  SquealSound=ScorpionSquealSound
  Components.Add(ScorpionSquealSound);

  CollisionSound=SoundCue'MobileVehicleContent.Sounds.ScorpionCollideSoundCue'
  EnterVehicleSound=SoundCue'MobileVehicleContent.Sounds.ScorpionStartSoundCue'

  Begin Object Name=CollisionCylinder
    BlockNonZeroExtent=false
    BlockZeroExtent=false
    BlockActors=false
    BlockRigidBody=false
    CollideActors=false
    CollisionHeight=40.f
    CollisionRadius=100.f
    Translation=(X=-25.f)
  End Object

  Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
    bSynthesizeSHLight=true
    bIsCharacterLightEnvironment=true
    bUseBooleanEnvironmentShadowing=true
  End Object
  Components.Add(MyLightEnvironment)
  LightEnvironment=MyLightEnvironment

  Begin Object Name=SVehicleMesh
    CastShadow=true
    bCastDynamicShadow=true
    bOverrideAttachmentOwnerVisibility=true
    bAcceptsDynamicDecals=false
    bPerBoneMotionBlur=true
    LightEnvironment=MyLightEnvironment
    SkeletalMesh=SkeletalMesh'MobileVehicleContent.SkeletalMeshes.ScorpionSkeletalMesh'
    AnimTreeTemplate=AnimTree'MobileVehicleContent.AnimTrees.ScorpionAnimTree'
    PhysicsAsset=PhysicsAsset'MobileVehicleContent.PhysicsAssets.ScorpionPhysicsAsset'
    AnimSets.Add(AnimSet'MobileVehicleContent.AnimSets.ScorpionAnimSet')
    RBCollideWithChannels=(Default=true,BlockingVolume=true,GameplayPhysics=true,EffectPhysics=true,Vehicle=true,Untitled4=true)
  End Object

  Begin Object Class=UDKVehicleSimCar Name=SimObject
    WheelSuspensionStiffness=100.f
    WheelSuspensionDamping=3.f
    WheelSuspensionBias=0.1f
    ChassisTorqueScale=0.f
    MaxBrakeTorque=5.f
    StopThreshold=100
    MaxSteerAngleCurve=(Points=((InVal=0.f,OutVal=45.f),(InVal=600.f,OutVal=15.f),(InVal=1100.f,OutVal=10.f),(InVal=1300.f,OutVal=6.f),(InVal=1600.f,OutVal=1.f)))
    SteerSpeed=110
    LSDFactor=0.f
    TorqueVSpeedCurve=(Points=((InVal=-600.f,OutVal=0.f),(InVal=-300.f,OutVal=80.f),(InVal=0.f,OutVal=130.f),(InVal=950.f,OutVal=130.f),(InVal=1050.f,OutVal=10.f),(InVal=1150.f,OutVal=0.f)))
    EngineRPMCurve=(Points=((InVal=-500.f,OutVal=2500.f),(InVal=0.f,OutVal=500.f),(InVal=549.f,OutVal=3500.f),(InVal=550.f,OutVal=1000.f),(InVal=849.f,OutVal=4500.f),(InVal=850.f,OutVal=1500.f),(InVal=1100.f,OutVal=5000.f)))
    EngineBrakeFactor=0.f25f
    ThrottleSpeed=0.2f
    WheelInertia=0.2f
    NumWheelsForFullSteering=4
    SteeringReductionFactor=0.f
    SteeringReductionMinSpeed=1100.f
    SteeringReductionSpeed=1400.f
    bAutoHandbrake=true
    bClampedFrictionModel=true
    FrontalCollisionGripFactor=0.18f
    ConsoleHardTurnGripFactor=1.f
    HardTurnMotorTorque=0.7f
    SpeedBasedTurnDamping=20.f
    AirControlTurnTorque=40.f
    InAirUprightMaxTorque=15.f
    InAirUprightTorqueFactor=-30.f
    WheelLongExtremumSlip=0.1f
    WheelLongExtremumValue=1.f
    WheelLongAsymptoteSlip=2.f
    WheelLongAsymptoteValue=0.6f
    WheelLatExtremumSlip=0.35f
    WheelLatExtremumValue=0.9f
    WheelLatAsymptoteSlip=1.4f
    WheelLatAsymptoteValue=0.9f
    bAutoDrive=false
    AutoDriveSteer=0.3f
  End Object
  SimObj=SimObject
  Components.Add(SimObject)

  Begin Object Class=MobileVehicleScorpionWheel Name=RRWheel
    BoneName="B_R_Tire"
    BoneOffset=(X=0.f,Y=20.f,Z=0.f)
    SkelControlName="B_R_Tire_Cont"
  End Object
  Wheels(0)=RRWheel

  Begin Object Class=MobileVehicleScorpionWheel Name=LRWheel
    BoneName="B_L_Tire"
    BoneOffset=(X=0.f,Y=-20.f,Z=0.f)
    SkelControlName="B_L_Tire_Cont"
  End Object
  Wheels(1)=LRWheel

  Begin Object Class=MobileVehicleScorpionWheel Name=RFWheel
    BoneName="F_R_Tire"
    BoneOffset=(X=0.f,Y=20.f,Z=0.f)
    SteerFactor=1.f
    LongSlipFactor=2.f
    LatSlipFactor=3.f
    HandbrakeLongSlipFactor=0.8
    HandbrakeLatSlipFactor=0.8
    SkelControlName="F_R_Tire_Cont"
  End Object
  Wheels(2)=RFWheel

  Begin Object Class=MobileVehicleScorpionWheel Name=LFWheel
    BoneName="F_L_Tire"
    BoneOffset=(X=0.f,Y=-20.f,Z=0.f)
    SteerFactor=1.f
    LongSlipFactor=2.f
    LatSlipFactor=3.f
    HandbrakeLongSlipFactor=0.8f
    HandbrakeLatSlipFactor=0.8f
    SkelControlName="F_L_Tire_Cont"
  End Object
  Wheels(3)=LFWheel
}

MobileVehicleScorpionWheel


このクラスは、UTGame パッケージにある UTVehicleScorpionWheel と同じものです。

MobileVehicleScorpionWheel.uc
class MobileVehicleScorpionWheel extends UDKVehicleWheel;

defaultproperties
{
  WheelRadius=27
  SuspensionTravel=40
  bPoweredWheel=true
  SteerFactor=0.0
  LongSlipFactor=2.0
  LatSlipFactor=2.75
  HandbrakeLongSlipFactor=0.7
  HandbrakeLatSlipFactor=0.3
  ParkedSlipFactor=10.0
}

ダウンロード


  • この例で使用されているコンテンツとコードは、 ここから ダウンロードすることができます。 (MobileVehicleExample.zip)