Wednesday, March 23, 2011

Alien Zombies Splash Screen & AI Script issues

Even though I'm nowhere near done I thought I would tinker around with some "Splash Screen" ideas today while I was still trying to figure out my Alien Zombie AI script problems. I was thinking that some of the screen captures I had done looked pretty nice. Even nicer I suppose if I run them through Corel Painter and tart them up a bit. But I thought I might as well get the ball rolling on that as my game will eventually need a start screen where players can click on "start Game" or "Choose Level"... stuf like that. All of which will have to be worked out and I've no cluse at the moment how any of that is done although I have watched a few video tutorials on splash screens and it doesn't seem too bad to understand. UNLIKE my blasted Alien Zombie AI script. check this crap out man.

var speed = 3.0;

var rotationSpeed = 5.0;
var attackRange = 30.0;
var dontComeCloserRange = 5.0;
var pickNextWaypointDistance = 2.0;
var target : Transform;
var modelAnimation : Animation;





// Make sure there is always a character controller
@script RequireComponent (CharacterController)


function Start () {
// Auto setup player as target through tags
if (target == null && GameObject.FindWithTag("Player"))
target = GameObject.FindWithTag("Player").transform;


Patrol();
}


function Patrol () {
var curWayPoint = AutoWayPoint.FindClosest(transform.position);
while (true) {
var waypointPosition = curWayPoint.transform.position;
// Are we close to a waypoint? -> pick the next one!
if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
curWayPoint = PickNextWaypoint (curWayPoint);


// Attack the player and wait until
// - player is killed
// - player is out of sight
if (CanSeeTarget ())
yield StartCoroutine("AttackPlayer");


// Move towards our target
MoveTowards(waypointPosition);


yield;
}
}




function CanSeeTarget () : boolean {
if (Vector3.Distance(transform.position, target.position) > attackRange)
return false;


var hit : RaycastHit;
if (Physics.Linecast (transform.position, target.position, hit))
return hit.transform == target;


return false;
}


function AttackPlayer () {
var lastVisiblePlayerPosition = target.position;
while (true) {
if (CanSeeTarget ()) {
// Target is dead - stop hunting
if (target == null)
return;






// Target is too far away - give up
var distance = Vector3.Distance(transform.position, target.position);
if (distance > attackRange * 3)
return;


lastVisiblePlayerPosition = target.position;
if (distance > dontComeCloserRange)
MoveTowards (lastVisiblePlayerPosition);






//Attack player with "Attack" animation which is basically a clawing and biting animation
//this "Attack" is supposed to inflict damage to the FPS player


else {
modelAnimation.CrossFade("idle");
RotateTowards(lastVisiblePlayerPosition);
}






var forward = transform.TransformDirection(Vector3.forward);
var targetDirection = lastVisiblePlayerPosition - transform.position;
targetDirection.y = 0;




var angle = Vector3.Angle(targetDirection, forward);
if (distance < attackRange);
yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
//Player not visible anymore - stop attacking
if (!CanSeeTarget())


return;




}


yield;
}
}


function SearchPlayer (position : Vector3) {
// Run towards the player but after 3 seconds timeout and go back to Patroling
var timeout = 3.0;
while (timeout > 0.0) {
MoveTowards(position);


// We found the player
if (CanSeeTarget ())
return;


timeout -= Time.deltaTime;
yield;
}
}


function RotateTowards (position : Vector3) {
SendMessage("SetSpeed", 0.0);


var direction = position - transform.position;
direction.y = 0;
if (direction.magnitude < 0.1)
return;






// Rotate towards the target
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
}


function MoveTowards (position : Vector3) {
var direction = position - transform.position;
direction.y = 0;
if (direction.magnitude < 0.5) {
SendMessage("SetSpeed", 0.0);
return;


}


// Rotate towards the target
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);


// Modify speed so we slow down when we are not facing the target
var forward = transform.TransformDirection(Vector3.forward);
var speedModifier = Vector3.Dot(forward, direction.normalized);
speedModifier = Mathf.Clamp01(speedModifier);


// Move the character
direction = forward * speed * speedModifier;
GetComponent (CharacterController).SimpleMove(direction);


SendMessage("SetSpeed", speed * speedModifier, SendMessageOptions.DontRequireReceiver);
}


function PickNextWaypoint (currentWaypoint : AutoWayPoint) {
// We want to find the waypoint where the character has to turn the least


// The direction in which we are walking
var forward = transform.TransformDirection(Vector3.forward);


// The closer two vectors, the larger the dot product will be.
var best = currentWaypoint;
var bestDot = -10.0;
for (var cur : AutoWayPoint in currentWaypoint.connected) {
var direction = Vector3.Normalize(cur.transform.position - transform.position);
var dot = Vector3.Dot(direction, forward);
if (dot > bestDot && cur != currentWaypoint) {
bestDot = dot;
best = cur;
}
}


return best;
}
 
 
I'm amazed my head doesn't explode with this stuff lol
Right now my idiot Alien Zombies will follow me around like lost puppies... they are TOTALLY incapable at the moment of inflicting damage on my FPS player. I can't seem to figure out how to get that to work either. you see I have 4 animation states for my Alien Zombies:
 
Idle
is basically when he's not doing anything just standing still
 
Walk
For when he's on patrol around his Waypoints
 
RunAttack
For when he sees my FPS player to run towards him.
 
ATTACK
A Clawing and biting attack for when he has reached my character and this one is SUPPOSED to do damage to my FPS player
 
 
Pretty straight forward simple melee attack right? Can I get it to work? Frak no. Not finding a boat load of help at any of the places that are set up to help either. To top it off I'm still trying to learn this code stuff but code has NEVER been my strong point so that is making it extra tough. Heck I'm amazed I've come this far with the whole thing. lol

No comments: