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