ANIMATION PROBLEM !! HELP !!
Hi guys. I'm currently making a survival horror game for our thesis and this animation problem is killing me for days. Whenever my enemy attacks, he just stays in place. I want him to follow me when I get too far from him and then attack at close range. Can you help me please?? It's my first time posting at this site. I really need help.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI;
namespace SA.AI { public class EnemyAI2 : MonoBehaviour {
public Transform playerTarget;
public Animator anim;
Vector3 direction;
Vector3 rotDirection;
bool isInView;
bool isInAngle;
bool isClear;
float radius = 9;
float maxDistance = 11;
int lFrame = 5;
int lFrame_counter = 0;
int llFrame = 15;
int llf_counter = 0;
public bool follow;
public AIState aiState;
public AIState targetState;
delegate void EveryFrame();
EveryFrame everyFrame;
delegate void LateFrame();
LateFrame lateFrame;
delegate void LateLateFrame();
LateLateFrame llateFrame;
[HideInInspector]
public NavMeshAgent agent;
public EnemyStats enStats = new EnemyStats();
public bool changeSt;
void Start()
{
agent = GetComponent<NavMeshAgent>();
aiState = AIState.idle;
ChangeState(AIState.idle);
anim = GetComponent<Animator>();
}
void Update()
{
if (changeSt) // pang Debug pag may problema
{
ChangeState(targetState);
changeSt = false;
}
Debug.Log(aiState.ToString());
MonitorStates();
if (everyFrame != null)
everyFrame();
lFrame_counter++;
if (lFrame_counter > lFrame)
{
if (lateFrame != null)
lateFrame();
lFrame_counter = 0;
}
llf_counter++;
if (llf_counter > llFrame)
{
if (llateFrame != null)
llateFrame();
llf_counter = 0;
}
}
void MonitorStates() //Nagrurun bawat Frame
{
switch (aiState)
{
case AIState.idle:
if (enStats.distanceFromTarget < radius)
ChangeState(AIState.inRadius);
if (enStats.distanceFromTarget > maxDistance)
ChangeState(AIState.lateIdle);
break;
case AIState.lateIdle:
if (enStats.distanceFromTarget < maxDistance)
ChangeState(AIState.idle);
break;
case AIState.inRadius:
if (enStats.distanceFromTarget > radius)
ChangeState(AIState.idle);
if (isClear)
ChangeState(AIState.inView);
break;
case AIState.inView:
if (enStats.distanceFromTarget > radius)
ChangeState(AIState.idle);
if (!isClear)
ChangeState(AIState.inSearch);
break;
case AIState.inSearch:
if (isClear)
ChangeState(AIState.inView);
MonitorBehaviorLife();
break;
default:
break;
}
}
public void MonitorBehaviorLife()
{
enStats.behaviorLife += Time.deltaTime;
if (enStats.behaviorLife > enStats.maxBehaviorLife)
{
enStats.behaviorLife = 2;
ChangeState(targetState);
}
}
public void ChangeState(AIState targetState)
{
aiState = targetState;
everyFrame = null;
lateFrame = null;
llateFrame = null;
switch (targetState)
{
case AIState.idle:
lateFrame = IdleBehaviours;
agent.speed = 0.2f;
break;
case AIState.lateIdle:
llateFrame = IdleBehaviours;
break;
case AIState.inRadius:
lateFrame = inRadiusBehaviors;
break;
case AIState.inView:
lateFrame = InViewBehaviorsSecondary;
everyFrame = MonitorTargetPosition;
everyFrame = InViewBehaviors;
enStats.lastKnownPosition = playerTarget.position;
agent.speed = 1f;
//StopMoving();
//MoveToPosition(enStats.lastKnownPosition);
break;
case AIState.inSearch:
lateFrame = InSearchBehaviors;
enStats.lastKnownPosition = playerTarget.position;
enStats.canidatePosition = enStats.lastKnownPosition;
MoveToPosition(enStats.lastKnownPosition);
float bhlifeOffset = Random.Range(-1, 5);
enStats.maxBehaviorLife = CommonBehaviors.searchLife + bhlifeOffset;
targetState = AIState.idle;
WaypointsBase wp = new WaypointsBase();
enStats.curWaypoint = wp;
agent.speed = 0.3f;
break;
default:
break;
}
}
void IdleBehaviours()
{
if (playerTarget == null)
return;
DistanceCheckPlayer(playerTarget);
CommonBehaviors.PatrolBehavior(this);
}
void inRadiusBehaviors()
{
if (playerTarget == null)
return;
Sight();
anim.SetBool ("Walk",true);
CommonBehaviors.PatrolBehavior(this);
}
void InViewBehaviors()
{
if (playerTarget == null)
return;
FindDirection(playerTarget);
RotateTowardsTarget();
CommonBehaviors.ChaseBehavior(this);
}
public void InViewBehaviorsSecondary() //Problem
{
Sight();
}
void InSearchBehaviors()
{
//anim.SetBool ("Walk",true);
CommonBehaviors.SearchBehavior(this);
Sight();
}
//AI moves
public void Sight()
{
DistanceCheckPlayer(playerTarget);
FindDirection(playerTarget);
AngleCheck();
if(isInAngle)
IsClearView(playerTarget);
}
public void DistanceCheckPlayer(Transform target)
{
enStats.distanceFromTarget = Vector3.Distance(transform.position, target.position);
}
public void IsClearView(Transform target)
{
isClear = false;
RaycastHit hit;
Vector3 origin = transform.position;
Debug.DrawRay(origin, direction * radius);
if (Physics.Raycast(origin, direction, out hit, 4))
{
Debug.Log(hit.transform.name);
if (hit.transform.CompareTag("Player"))
{
isClear = true;
}
}
}
public void AngleCheck()
{
rotDirection = direction;
rotDirection.y = 0;
if (rotDirection == Vector3.zero)
rotDirection = transform.forward;
float angle = Vector3.Angle(transform.forward, rotDirection);
isInAngle = (angle < 60);
}
public void RotateTowardsTarget()
{
if (rotDirection == Vector3.zero)
rotDirection = transform.forward;
Quaternion targetRotation = Quaternion.LookRotation(rotDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5);
}
public void FindDirection(Transform target)
{
enStats.target = target;
direction = target.position - transform.position;
rotDirection = direction;
rotDirection.y = 0;
}
public void MonitorTargetPosition()
{
float delta_distance = Vector3.Distance(playerTarget.position, enStats.lastKnownPosition);
if (delta_distance < 0.2f)
{
enStats.lastKnownPosition = playerTarget.position;
MoveToPosition (enStats.lastKnownPosition);
}
}
public void MoveToPosition(Vector3 targetPosition)
{
agent.isStopped = false;
agent.SetDestination(targetPosition);
}
public void StopMoving()
{
agent.isStopped = true;
//agent.stoppingDistance = 3;
}
public Vector3 RandomVector3AroundPosition(Vector3 targetPosition)
{
anim.SetBool ("Walk", true);
float offsetX = Random.Range(-3, 3);
float offsetZ = Random.Range(-3, 3);
Vector3 originPos = targetPosition;
originPos.x += offsetX;
originPos.z += offsetZ;
NavMeshHit hit;
if(NavMesh.SamplePosition(originPos, out hit, 3, NavMesh.AllAreas))
{
return hit.position;
}
return targetPosition;
}
public enum AIState
{
idle, lateIdle, inRadius, inView, inSearch
}
}
} `
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace SA.AI
{
public static class CommonBehaviors
{
public static float searchLife = 50;
public static void PatrolBehavior(EnemyAI2 ai)
{
EnemyStats e = ai.enStats;
if (e.waypoints.Count > 0)
{
if (e.curWaypoint.targetDestination == null)
{
e.curWaypoint = e.waypoints[e.waypointIndex];
ai.MoveToPosition(e.curWaypoint.targetDestination.position);
}
if (ai.agent.velocity == Vector3.zero)
ai.agent.isStopped = false;
e.curWaypoint = e.waypoints[e.waypointIndex];
e.waypointDistance = Vector3.Distance(ai.transform.position, e.curWaypoint.targetDestination.position);
if (e.waypointDistance < 1.2f)
{
ai.anim.SetBool ("Walk", false);
e.waitTimeWP += Time.deltaTime * 15;
if (e.waitTimeWP > e.maxWaitTime)
{
e.waitTimeWP = 0;
if (e.waypointIndex < e.waypoints.Count - 1)
{
e.waypointIndex++;
}
else
{
e.waypointIndex = 0;
//e.waypoints.Reverse();
}
e.curWaypoint = e.waypoints[e.waypointIndex];
e.maxWaitTime = e.curWaypoint.waitTime;
ai.MoveToPosition(e.curWaypoint.targetDestination.position);
}
}
}
}
public static void SearchBehavior(EnemyAI2 ai)
{
EnemyStats e = ai.enStats;
float distanceCheck = Vector3.Distance(ai.transform.position, ai.enStats.canidatePosition);
ai.anim.SetBool ("Attack",false);
ai.anim.SetBool ("Run",false);
ai.anim.SetBool ("Walk",true);
if(distanceCheck < 1.2f)
{
ai.anim.SetBool ("Walk", false);
e.waitTimeWP += Time.deltaTime * 15;
if (e.waitTimeWP > e.maxWaitTime)
{
e.waitTimeWP = 0;
e.maxWaitTime = Random.Range(3, 6);
e.canidatePosition = ai.RandomVector3AroundPosition(e.lastKnownPosition);
ai.MoveToPosition(ai.enStats.canidatePosition);
}
}
}
public static void ChaseBehavior(EnemyAI2 ai)
{
EnemyStats e = ai.enStats;
float distanceCheck = Vector3.Distance(ai.transform.position, ai.enStats.lastKnownPosition);
ai.anim.SetBool ("Run",true);
ai.anim.SetBool ("Walk",false);
if (distanceCheck < 1f) {
ai.anim.SetBool ("Attack", true);
ai.StopMoving ();
}
else
{
//ai.anim.SetBool ("Run",false);
ai.MoveToPosition(e.lastKnownPosition);
Debug.Log ("Running!");
}
}
}
[System.Serializable]
public class WaypointsBase
{
public Transform targetDestination;
public float waitTime = 1;
}
}
![using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace SA.AI
{
[System.Serializable]
public class EnemyStats
{
public List<WaypointsBase> waypoints = new List<WaypointsBase>();
[HideInInspector]
public WaypointsBase curWaypoint;
public float inRange = 1;
//[HideInInspector]
public int waypointIndex;
//[HideInInspector]
public float waypointDistance;
//[HideInInspector]
public float waitTimeWP;
//[HideInInspector]
public float maxWaitTime;
//[HideInInspector]
public float behaviorLife;
//[HideInInspector]
public float maxBehaviorLife;
//[HideInInspector]
public float distanceFromTarget;
//[HideInInspector]
public Vector3 lastKnownPosition;
//[HideInInspector]
public Transform target;
//[HideInInspector]
public Vector3 canidatePosition;
}
}][1]
[1]: /storage/temp/121309-37671761-2423548970992184-822843565578125312-n.jpg
,
Your answer
Follow this Question
Related Questions
Rotate and more - Help 0 Answers
Entire body moving with the camera 1 Answer
how to control my rigged model view with mouse? 0 Answers
I am new to unity and have problem with bricks game. 0 Answers
How do I make my camera Switch between 2 layer views? 0 Answers