Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Numerics;
- using UnityEngine;
- using UnityEngine.AI;
- using Vector3 = UnityEngine.Vector3;
- public class AI : MonoBehaviour
- {
- // Start is called before the first frame update
- PC_Character Character;
- PC_CharacterStats CharacterStats;
- NavMeshAgent navMeshAgent;
- Animator animator;
- public GameObject Enemy; //적 오브젝트
- public GameObject Player; //일단 거리계산을 위해 플레이어 오브젝트도 따로 만듦
- Vector3 EnemyDir;
- Vector3 AvoidPosition = new Vector3(0.9f, 6.7f, 25); //미리 설정한 회피 위치
- Vector3 TestPositon = new Vector3(-5.8f, 7, -10); //미리 설정한 위치
- Vector3 CenterPosition = new Vector3(-6, 6.5f, 6); //미리 설정한 센터 위치
- private float Dist; //플레이어와 적 거리 계산해 넣을 변수
- void Start()
- {
- Character = GetComponent<PC_Character>();
- CharacterStats = GetComponent<PC_CharacterStats>();
- navMeshAgent = GetComponent<NavMeshAgent>();
- animator = GetComponent<Animator>();
- }
- // Update is called once per frame
- void Update()
- {
- Dist = Vector3.Distance(Player.transform.position, Enemy.transform.position); //플레이어와 적 오브젝트 간의 거리 계산
- if (Enemy != null && !Enemy.activeSelf) Enemy = null; // 적이 죽었을시 타켓 초기화
- if (Enemy == null)
- {
- animator.SetBool("isMove", true);
- navMeshAgent.SetDestination(CenterPosition); //적이 없으면 센터로 이동
- }
- if (Enemy != null && !Enemy.GetComponent<PC_CharacterStats>().InGrass) // 적이 부쉬에 없을시
- {
- if (CharacterStats.HP < Enemy.GetComponent<PC_CharacterStats>().HP)
- {
- //체력이 적보다 적을 때 취하는 행동?
- //일단 도망가는 AI 개선이 필요하다.
- animator.SetBool("isMove", true);
- navMeshAgent.stoppingDistance = 0.5f;
- if (gameObject.CompareTag("Enemy")) navMeshAgent.SetDestination(AvoidPosition);
- else if(gameObject.CompareTag("Friendly")) navMeshAgent.SetDestination(TestPositon);
- }
- else
- {
- //적보다 체력이 불리하지 않을 때 취하는 행동
- animator.SetBool("isMove", true);
- navMeshAgent.stoppingDistance = 5; //적과 5의 거리 유지?
- navMeshAgent.SetDestination(Enemy.transform.position);
- }
- EnemyDir = Enemy.transform.position - transform.position; //적의 위치와 나의 위치 상대 연산?
- Character.point = new Vector3(EnemyDir.x, 0, EnemyDir.z);
- if (CharacterStats.ReadyUltiFire) Character.UltimateAttack(); //궁극기 충전 - 궁극기 나감
- else Character.BasicAttack(); //그렇지 않다면 그냥 일반 공격을 함
- }
- else if (CharacterStats.HP <= 100) navMeshAgent.SetDestination(AvoidPosition);
- //적이 부쉬에 있고, 캐릭터 HP가 100보다 작다면 회피 포지션으로 목적지 설정
- }
- //목적지가 Enemy.transform.position일 때(추적 중일 때) 플레이어가 부쉬에 들어간다면
- //&& 그리고 플레이어가 AI의 식별 거리 내에 있다면 ==> 두 조건 모두 만족 시 플레이어가 부쉬로 들어간 위치 찍고 추적하는 구문 제작해야함
- private void OnTriggerEnter(Collider collision) //플레이어가 트리거 안에 들어갔을 때 실행되는 메소드
- {
- if (Dist <= 6 && collision.CompareTag("Grass")) //플레이어와 적 간 거리 6 이내이고, 플레이어가 들어간 곳이 부쉬일 때
- {
- Vector3 spotPos=Player.transform.position; //플레이어가 부쉬에 들어갈 당시의 위치
- navMeshAgent.SetDestination(spotPos); //플레이어가 부쉬에 들어간 지점의 위치로 목적지 설정.
- navMeshAgent.stoppingDistance = 1; //부쉬에 들어간 지점과의 거리는 1이 되면 되도록 설정.
- }
- }
- private void OnEnable()
- {
- Enemy = null; //초기화???
- EnemyDir = transform.position; //???
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement