Security Cameras

From Oldunreal-Wiki
Jump to navigation Jump to search

This is a rundown of a quick security camera that will find a target and then start to track it, but thats about it... :) It is a good basis for expanding with some more features, maybe give it a default rotation in its Idle state, or the ability to switch targets, etc etc. Also included here is a simple trigger for testing out the camera, all it does is set the ViewTarget when something touches it, and reset the ViewTarget when the something untouches it.


// =============================================
// scam.scamCamera
// =============================================
class scamCamera expands StationaryPawn;
// VisRadius is the max area to search for possible targets
var() float VisRadius;
// TargetClass is the type of target we want to track
var() class<Actor> TargetClass;
// Target stores a reference to our target once we have one
var Actor Target;
// The Tracking state checks to make sure our Target is still valid
// and then uses DesiredRotation to keep in the camera facing them.
// By setting DesiredRotation and RotationRate you can have the
// engine automatically rotate to a new direction.
state Tracking
{
  function Timer()
  {
    if (Target == NONE)
    {
      GotoState('Idle');
      return;
    }
    DesiredRotation = rotator(Target.Location - Location);
    DesiredRotation.Roll = Rotation.Roll;
  }
Begin:
  SetTimer(0.5, true);
  SetPhysics(PHYS_Rotating);
}
// The Idle state looks for valid targets using the RadiusActors
// iterator.  Iterators are very useful functions that will go
// through a list of actor based on the criteria you supply. 
// RadiusActors is just one of the available ones, look in the
// Actor class to see the rest of them.
// Once we find a target, and it is in front of the camera it
// will set the Target and go to the Tracking state.
auto state Idle
{
  function Timer()
  {
    local Actor a;
    local vector x, y, z;
    GetAxes(Default.Rotation, x, y, z);
    foreach RadiusActors(TargetClass, a, VisRadius)
      if ( ((a.Location - Location) dot x) > 0)
      {
        Target = a;
        GotoState('Tracking');
      }
    if (DesiredRotation == Rotation)
    {
    }
  }
Begin:
  Target = NONE;
  if (TargetClass == NONE)
    TargetClass = class'Engine.Actor';
  SetTimer(0.5, true);
}
defaultproperties 
{
  VisRadius=1024.0
  TargetClass=class'Engine.Pawn'
  Mesh=LodMesh'UnrealShare.EightPick'
  CollisionRadius=28.000000
  RotationRate=(Pitch=5000,Yaw=5000,Roll=5000)
}
// =============================================
// scam.CameraTrigger
// =============================================
class CameraTrigger expands Trigger;
// When a player touches the trigger it will set the player's
// viewtarget to the Camera.  If you look at the PlayerCalcView()
// function in PlayerPawn you will see that it will set the
// view to the location and direction of ViewTarget if it is
// set, which is exactly what we need for the security camera.
function Touch( actor Other )
{
  local scamCamera c;
  if( IsRelevant( Other ) )
  {
    foreach AllActors(class'scamCamera', c, Event)
      if ( c.IsA('scamCamera') && Other.IsA('PlayerPawn') )
        PlayerPawn(Other).ViewTarget = c;
  }
  Super.Touch(Other);
}
// When the player stops touching the trigger it will go
// ahead and reset their ViewTarget back to NONE, which
// will reset their view back to normal.
function UnTouch(actor Other)
{
  if ( Other.IsA('PlayerPawn') )
  {
     if ( PlayerPawn(Other).ViewTarget.Event == Tag )
      PlayerPawn(Other).ViewTarget = NONE;
  }
}
defaultproperties 
{

}