Untitled

 avatar
unknown
plain_text
2 years ago
10 kB
6
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.AI;
using UnityEngine.UIElements;

public class KnifeController : MonoBehaviour
{
    [Header("Target&Weapon")]
    public GameObject player;
    public MeleeWeapon meleeWeapon;

    [Header("Navigation")]
    NavMeshAgent navMeshAgent;
    public TargetScanner targetScanner;
    public GameObject currentTarget;
    public float delayLostTarget = 10f;
    private float timeLostTarget = 0;

    [Header("Action")]
    Animator animator;
    public string currentAction;
    const string STAND_STATE = "Stand";
    public const string WALK_STATE = "Walk";
    public const string ATTACK_STATE = "Attack";
    public bool isChasing = false;

    private float checkInterval = 2f; 
    private Vector3 previousPosition; 
    private float checkTimer; 

    private void Awake()
    {
        currentAction = STAND_STATE;
        animator = GetComponent<Animator>();
        navMeshAgent = GetComponent<NavMeshAgent>();
        player = FindObjectOfType<PlayerFPS>().gameObject;
    }
    private void Update()
    {
        checkTimer += Time.deltaTime;

        if (checkTimer >= checkInterval)
        {
            float distance = Vector3.Distance(transform.position, previousPosition);
            if (distance < 0.01f)
            {
                if (currentAction == WALK_STATE)
                {
                    Debug.Log("stuck");                   
                    navMeshAgent.enabled = false;
                    navMeshAgent.enabled = true;
                    navMeshAgent.ResetPath();
                }               
            }
            checkTimer = 0f;
            previousPosition = transform.position;
        }

        FindingTarget();

        if (currentTarget == null)
        {
            return;
        }
        if (MovingToTarget())
        {
            navMeshAgent.speed = 4;
            Walk();
            return;
        }
        if (currentAction != ATTACK_STATE)
        {
            Attack();
            return;
        }
    }
    public void MeleeWeaponStartAttack()
    {
        meleeWeapon.isAttacking = true;
        meleeWeapon.StartAttack();
        navMeshAgent.isStopped = true; 
    }
    public void MeleeWeaponStopAttack()
    {
        meleeWeapon.isAttacking = false;
        meleeWeapon.StopAttack();
    }
    public void DamageAgro()
    {
        currentTarget = player;
    }
    public void Stand()
    {    
        ResetAnimation();
        currentAction = STAND_STATE;
        animator.SetBool("Stand", true);
    }
    private void Attack()
    {    
        ResetAnimation();
        currentAction = ATTACK_STATE;
        animator.SetBool(ATTACK_STATE, true);      
    }

    private void OnAttackFinished()
    {       
        if (navMeshAgent.stoppingDistance == 1)
        {
            Debug.Log("attack again");
            Attack();
            return;
        }
        else
        {
            Debug.Log("move to player");
            navMeshAgent.isStopped = false;               
            return;
        }
    }
    private bool MovingToTarget()
    {
        if (currentTarget == null)
        {
            return false;
        }

        navMeshAgent.SetDestination(currentTarget.transform.position);

        if (navMeshAgent.pathPending)
        {
            if (currentAction != WALK_STATE)
                Walk();
        }
        else if (navMeshAgent.remainingDistance > navMeshAgent.stoppingDistance)
        {
            if (currentAction != WALK_STATE)
                Walk();
        }
        else
        {
            RotateToTarget(currentTarget.transform);
            Attack();            
            return false;
        }
        return true;
    }
    private void FindingTarget()
    {    
        if (targetScanner.Detect(transform, player))
        {
            currentTarget = player;
            timeLostTarget = 0;
            return;
        }

        if (currentTarget != null)
        {
            timeLostTarget += Time.deltaTime;

            if (timeLostTarget > delayLostTarget)
            {
                timeLostTarget = 0;
                currentTarget = null;
            }
            return;
        }
        currentTarget = null;
    }
    public void Walk()
    {       
        ResetAnimation();
        currentAction = WALK_STATE;
        animator.SetBool(WALK_STATE, true);        
    }
    private void RotateToTarget(Transform target)
    {
        Vector3 direction = (target.position - transform.position).normalized;
        Quaternion lookRotation = Quaternion.LookRotation(new Vector3(direction.x, 0, direction.z));
        transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * 8f);
        return;
    }
    private void ResetAnimation()
    {
        animator.SetBool(STAND_STATE, false);
        animator.SetBool(WALK_STATE, false);
        animator.SetBool(ATTACK_STATE, false);
    }
}

using UnityEngine;
using UnityEngine.AI;

public class WanderAIKnife : MonoBehaviour
{
    public NavMeshAgent agent;

    [Header("Speed&Radius")]
    [Range(0, 100)] public float speed;
    [Range(1, 500)] public float walkRadius;

    [Header("Navigation")]
    public GameObject NavSphere;
    private Vector3 currentDestination;

    [Header("Scripts")]
    [SerializeField]
    public KnifeController KnifeController;
    [SerializeField]
    public ReceiveDamageBAD ReceiveDamageBAD;

    public void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        if (agent != null && KnifeController.currentTarget == null)
        {
            agent.speed = speed;
            currentDestination = RandomNavMeshLocation();
            agent.SetDestination(currentDestination);
            KnifeController.Walk();
        }
    }
    public void Update()
    {
        if (agent != null && !agent.pathPending && agent.remainingDistance <= agent.stoppingDistance && KnifeController.currentTarget == null)
        {
            if (agent != null && !agent.pathPending && Vector3.Distance(agent.transform.position, currentDestination) <= agent.stoppingDistance && KnifeController.currentTarget == null)
            {              
                currentDestination = RandomNavMeshLocation(); 
                KnifeController.Stand();
            }
            agent.SetDestination(currentDestination); 
            KnifeController.Walk();
        }
    }
    private Vector3 RandomNavMeshLocation()
    {
        Vector3 finalPosition = Vector3.zero;

        while (finalPosition == Vector3.zero || !NavSphere.GetComponent<Collider>().bounds.Contains(finalPosition))
        {
            Vector3 randomPosition = Random.insideUnitSphere * walkRadius;
            randomPosition += transform.position;

            if (NavMesh.SamplePosition(randomPosition, out NavMeshHit hit, walkRadius, 1))
            {
                finalPosition = hit.position;
            }
        }
        return finalPosition;
    }
}


using System.Collections;
using UnityEngine;
using UnityEngine.AI;

public class ReceiveDamageBAD : MonoBehaviour
{
    [Header("Health")]
    public int maxHitPoint = 5;
    public int hitPoint = 0;
    public bool isDead = false;

    [Header("Sound")]
    public AudioClip hitsound;
    public AudioSource Ganados;

    [Header("RagdollColliders")]
    public CapsuleCollider caps1;
    public CapsuleCollider caps2;
    public CapsuleCollider caps3;
    public CapsuleCollider caps4;
    public CapsuleCollider caps5;
    public CapsuleCollider caps6;
    public CapsuleCollider caps7;
    public CapsuleCollider caps8;
    public CapsuleCollider caps9;
    public BoxCollider boxcol1;
    public BoxCollider boxcol2;

    [Header("Scripts")]
    [SerializeField]
    public KnifeController KnifeController;
    public GameObject weapon;
    public GameObject BloodFX;
    private NavMeshAgent navMeshAgent;

    void Start()
    {
        hitPoint = maxHitPoint;
        navMeshAgent = GetComponent<NavMeshAgent>();     
    }

    void Update()
    {     
        if (hitPoint <= 0)
        {
            gameObject.GetComponent<NavMeshAgent>().enabled = false;

            isDead = true;

            GetComponent<AudioSource>().clip = hitsound;
            GetComponent<AudioSource>().Play();
            weapon.GetComponent<BoxCollider>().enabled = false;
            GetComponent<KnifeController>().enabled = false;

            caps1.GetComponent<Rigidbody>().isKinematic = false;
            caps2.GetComponent<Rigidbody>().isKinematic = false;
            caps3.GetComponent<Rigidbody>().isKinematic = false;
            caps4.GetComponent<Rigidbody>().isKinematic = false;
            caps5.GetComponent<Rigidbody>().isKinematic = false;
            caps6.GetComponent<Rigidbody>().isKinematic = false;
            caps7.GetComponent<Rigidbody>().isKinematic = false;
            caps8.GetComponent<Rigidbody>().isKinematic = false;
            caps9.GetComponent<Rigidbody>().isKinematic = false;
            boxcol1.GetComponent<Rigidbody>().isKinematic = false;
            boxcol2.GetComponent<Rigidbody>().isKinematic = false;
       
            GetComponent<Animator>().enabled = false;
           
            StartCoroutine(Destroyondeath());                                           
        }
    }

    IEnumerator Destroyondeath()
    {
        yield return new WaitForSeconds(15);                
        Destroy(BloodFX);       
    }
    
    public void GetDamage(int damage)
    {        
        hitPoint -= damage;

        if (hitPoint > 0)
        {
            KnifeController.DamageAgro();
        }
    }
}
Editor is loading...