4 Hour Code/Assets
To be fair 1 hour of the above was me banging my head against the wall or the keyboard, I went for my cat but she ran away. The logic for this code is a mix of simple and fustrating. This could be looked at as rudimentry AI, as it is able to follow you and knows when to stop, it also will not venture to far from its home. I am planning on making each planet a "home base" but that can wait for later. I really need to work on my commenting more.
using UnityEngine;
using System.Collections;
public class EnemyShip : MonoBehaviour
{
public float SpeedMax = 10f;
public float SpeedMin = 7f;
public int rotationSpeed = 50;
public int followRange = 75;
public float chaseTime = 5;
public float patrolRaduis = 10;
public float maxPatrolDistance = 100;
public static float moveSpeed;
private Vector3 patrolRaduisV3;
private Transform playerShip; //the enemy's target var moveSpeed = 3; //move speed var rotationSpeed = 3; //speed of turning
private Transform myTransform; //current transform data of this enemy
private Vector3 myStartPosition;
private Vector3 myTarget = new Vector3(0,0,0);
private Vector3 direction = new Vector3(1, 0, 0);
private float startChaseTime;
enum EnemyState
{
Patrol,
Attack,
Chase,
Return
}
EnemyState enemyState;
void Awake()
{
myTransform = transform;//cache transform data for easy access/preformance
enemyState = EnemyState.Patrol;
}
void Start()
{
playerShip = GameObject.FindWithTag("Player").transform; //target the player
moveSpeed = Random.Range(SpeedMin, SpeedMax);
startChaseTime = chaseTime;
myStartPosition = myTransform.position;
myTarget = myTransform.position;
myTarget = new Vector3(myTarget.x, 0, myTarget.z);
}
void FixedUpdate()
{
switch (enemyState)
{
case EnemyState.Patrol:
Patrol();
if (Vector3.Distance(playerShip.transform.position, myTransform.position) < followRange)
{
enemyState = EnemyState.Attack;
}
if (Vector3.Distance(myStartPosition, myTransform.position) > maxPatrolDistance)
{
enemyState = EnemyState.Return;
}
break;
case EnemyState.Attack:
Follow();
if (Vector3.Distance(playerShip.transform.position, myTransform.position) > followRange)
{
enemyState = EnemyState.Chase;
}
break;
case EnemyState.Chase:
Follow();
chaseTime -= Time.deltaTime;
if (chaseTime <= 0)
{
enemyState = EnemyState.Return;
chaseTime = startChaseTime;
}
break;
case EnemyState.Return:
Return();
// Need to convert all the floats to Int other wise the physics engin will not be able to make float = float
if ((int)myTransform.position.x == (int)myStartPosition.x && (int)myTransform.position.z == (int)myStartPosition.z)
{
enemyState = EnemyState.Patrol;
}
break;
}
}
void Patrol()
{
if ((int)myTarget.x == (int)myTransform.position.x && (int)myTarget.z == (int)myTransform.position.z)
{
patrolRaduisV3 = Random.insideUnitSphere * patrolRaduis;
myTarget = patrolRaduisV3 + myTransform.position;
myTarget = new Vector3(myTarget.x, 0, myTarget.z);
}
else
{
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(myTarget - myTransform.position), rotationSpeed * Time.deltaTime);
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
}
void Follow()
{
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(playerShip.position - myTransform.position), rotationSpeed * Time.deltaTime);
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
void Return()
{
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(myStartPosition - myTransform.position), rotationSpeed * Time.deltaTime);
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
}
No comments:
Post a Comment