| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- N Queen 문제
- 비주얼 스튜디오
- 루아
- 비주얼 스튜디오 다운로드
- lua download
- 온라인 비주얼 스튜디오
- Lua란
- LUA
- c++ 등차수열 합
- c언어 최대최소
- for문
- 게임제작
- c sharp hello world
- c샾 헬로우 월드
- Lua 설명
- N Queens Problem
- c언어 콘서트 배열 2번
- c언어 콘서트 배열
- c언어 배열 programming
- c#온라인
- 2중 반복문
- Lua language
- 메이플스토리
- c샾 hello world
- N Queen Coordinates
- lua 다운로드
- c언어 버블정렬
- 유니티
- 루아다운로드
- C언어 달력
Archives
- Today
- Total
Ln Go
Enemy 본문
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
public class Enemy : MonoBehaviour
{
public enum Type { A, B, C, D };
public Type enemyType;
public int maxHealth;
public int curHealth;
public int score;
public GameManager manager;
public Transform target;
public BoxCollider meleeArea;
public GameObject bullet;
public GameObject[] coins;
public bool isChase;
public bool isAttack;
public bool isDead;
public Rigidbody rigid;
public BoxCollider boxCollider;
public MeshRenderer[] meshs;
public NavMeshAgent nav;
public Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody>();
boxCollider = GetComponent<BoxCollider>();
// Material은 Mesh Renderer 컴포넌트에서 접근 가능!
// mav = GetComponentInChildren<MeshRenderer>().material;
meshs = GetComponentsInChildren<MeshRenderer>();
nav = GetComponent<NavMeshAgent>();
anim = GetComponentInChildren<Animator>();
if (enemyType != Type.D)
Invoke("ChaseStart", 2);
}
void ChaseStart()
{
isChase = true;
anim.SetBool("isWalk", true);
}
void FreezVelocity()
{
if (isChase)
{
rigid.velocity = Vector3.zero;
rigid.angularVelocity = Vector3.zero;
}
}
void Update()
{
if (nav.enabled && enemyType != Type.D)
{
nav.SetDestination(target.position);
nav.isStopped = !isChase;
}
// SetDestination() : 도착할 목표 위치 지정 함수
}
void Targeting()
{
float targetRadius = 0f;
float targetRange = 0f;
if (!isDead && (enemyType != Type.D))
{
switch (enemyType)
{
case Type.A:
targetRadius = 1.5f;
targetRange = 3f;
break;
case Type.B:
targetRadius = 1f;
targetRange = 12f;
break;
case Type.C:
targetRadius = 0.5f;
targetRange = 25f;
break;
}
RaycastHit[] rayHits =
Physics.SphereCastAll(transform.position,
targetRadius,
transform.forward,
targetRange,
LayerMask.GetMask("Player"));
if (rayHits.Length > 0 && !isAttack)
{
StartCoroutine(Attack());
}
}
}
IEnumerator Attack()
{
isChase = false;
isAttack = true;
anim.SetBool("isAttack", true);
switch (enemyType)
{
case Type.A:
yield return new WaitForSeconds(0.2f);
meleeArea.enabled = true;
yield return new WaitForSeconds(1f);
meleeArea.enabled = false;
yield return new WaitForSeconds(1f);
break;
case Type.B:
yield return new WaitForSeconds(0.1f);
rigid.AddForce(transform.forward * 20, ForceMode.Impulse);
meleeArea.enabled = true;
yield return new WaitForSeconds(0.5f);
rigid.velocity = Vector3.zero;
meleeArea.enabled = false;
yield return new WaitForSeconds(2f);
break;
case Type.C:
yield return new WaitForSeconds(0.5f);
GameObject instantBullet = Instantiate(bullet, transform.position, transform.rotation);
Rigidbody rigidBullet = instantBullet.GetComponent<Rigidbody>();
rigidBullet.velocity = transform.forward * 20;
yield return new WaitForSeconds(2f);
break;
}
isChase = true;
isAttack = false;
anim.SetBool("isAttack", false);
}
void FixedUpdate()
{
Targeting();
FreezVelocity();
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Melee")
{
Weapon weapon = other.GetComponent<Weapon>();
curHealth -= weapon.damage;
//현재 위치에 피격 위치를 빼서 반작용 방향 구하기
Vector3 reactVec = transform.position - other.transform.position;
StartCoroutine(OnDamage(reactVec, false));
}
else if (other.tag == "Bullet")
{
Bullet bullet = other.GetComponent<Bullet>();
curHealth -= bullet.damage;
Vector3 reactVec = transform.position - other.transform.position;
Destroy(other.gameObject);
StartCoroutine(OnDamage(reactVec, false));
}
}
public void HitByGrenade(Vector3 explosionPos)
{
curHealth -= 100;
Vector3 reactVec = transform.position - explosionPos;
StartCoroutine(OnDamage(reactVec, true));
}
IEnumerator OnDamage(Vector3 reactVec, bool isGrenade)
{
foreach (MeshRenderer mesh in meshs)
mesh.material.color = Color.red;
yield return new WaitForSeconds(0.1f);
if (curHealth > 0)
{
foreach (MeshRenderer mesh in meshs)
mesh.material.color = Color.white;
}
else
{
foreach (MeshRenderer mesh in meshs)
mesh.material.color = Color.gray;
gameObject.layer = 14;
//레이어 번호를 그대로 gameObject.layer에 적용
isDead = true;
isChase = false;
nav.enabled = false;
anim.SetTrigger("doDie");
Player player = target.GetComponent<Player>();
player.score += score;
int ranCoin = Random.Range(0, 3);
Instantiate(coins[ranCoin], transform.position, Quaternion.identity);
switch (enemyType)
{
case Type.A:
manager.enemyCntA--;
break;
case Type.B:
manager.enemyCntB--;
break;
case Type.C:
manager.enemyCntC--;
break;
case Type.D:
manager.enemyCntD--;
break;
}
if (isGrenade)
{
reactVec = reactVec.normalized;
reactVec += Vector3.up * 3;
rigid.freezeRotation = false;
rigid.AddForce(reactVec * 5, ForceMode.Impulse);
rigid.AddTorque(reactVec * 15, ForceMode.Impulse);
}
else
{
reactVec = reactVec.normalized;
reactVec += Vector3.up;
rigid.AddForce(reactVec * 5, ForceMode.Impulse);
}
Destroy(gameObject, 4);
}
}
}
'Unity > Quad Action' 카테고리의 다른 글
| BossMissile (0) | 2021.06.04 |
|---|---|
| BossRock (0) | 2021.06.04 |
| Boss (0) | 2021.06.04 |
| Player (0) | 2021.06.04 |
| GameManager (0) | 2021.06.04 |
Comments