https://www.youtube.com/watch?v=IoaPxcSHwEM

 

허수아비 처럼 데미지 테스트하는 에너미를 만들어보자

 

 

3d object cube 하나 생성

 

리지드 바디 컴포 넣기

콘스트레인 프리즈 로테이션 x 축, z 축 체크 온

 

 

 

Enemy 라는 이름의 스크립트 하나 생성 

 

위에 만든 큐브에 컴포 적용

큐브 이름 바꾸기 : Test Enemy

 

 

저번에 만든 총알들 프리팹 태그 Bullet 태그 만들어서 태그 지정

 

 

    public int maxHealth;
    public int curHealth;

 

체력 설정할 땐,

최대체력 max hp 와

현재체력 current hp 

두 개가 항상 세트로 있다

 

Weapon weapon = other.GetComponent<Weapon>();

 

다른 스크립트에서 weapon 값을 가지고 오겠다는 뜻

 

 

    void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Melee")
        {
            Weapon weapon = other.GetComponent<Weapon>();
            curHealth -= weapon.damage;
        }
        else if (other.tag == "Bullet")
            {
            Bullet bullet = other.GetComponent<Bullet>();
            curHealth -= bullet.damage;
            }

    }

근접 공격 받으면 무기 데미지를 체력에서 빼고

원거리 공격 받으면 총알 데미지를 체력에서 빼겠다는 뜻

 

 

 

테스트 에너미의 체력을 둘 다 60으로 설정한다

 

 

총알과 무기(햄머) 콜라이더에 is trigger 체크 on

 

무기 햄머는 캐릭터 - 관절 - 오른손 - 무기햄머 이렇게 하이어라 펼쳐봐야 함

 

 

 

지금까지 만들었으면, 총알이 안 사라지고 남아있는 버그가 있음

 

 

using UnityEngine;

public class Bullet : MonoBehaviour
{

    public int damage;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Floor")
        {
            Destroy(gameObject, 1.0f); // 부딪친후 3초 후 삭제
        }
    }
    void OnTriggerEnter(Collider other)
    { 
        if (other.gameObject.tag == "Wall")
        {
            Destroy(gameObject, 0.0f);
        }
    }
}

 

Bullet 스크립트를 위와 같이 변경하면 됨

 

 

+

 

피격시 빨갛게 되기 처리 구현해보기

 

 

 

    mat = GetComponent<MeshRenderer>().material;

 

스크립트에서 마테리알을 가져올땐 위와 같이 메쉬 렌더러를 이용한다 함

 

 

        if (curHealth > 0)
        { mat.color = Color.white; }
        else
        { 
            mat.color = Color.gray;
            Destroy(gameObject, 2);
        }

현재 체력이 1 이상이면 살았으니 하얀색을 띈 다는 뜻임

 

현재 체력이 0 또는 0 보다 낮으면 회색을 띈다는 뜻임, 게다가 2초 후 사라진다는 뜻임.

 

            Destroy(gameObject, 2);

 

디스트로이 뒤에 붙은 숫자는 2 초 후에 사라지겠다는 걸 의미함

 

 

             Destroy(other.gameObject);

그냥 gameObject는 자기 자신을 사라지게 하겠다

other.gameObject는 다른 오브젝트를 제거하겠다는 뜻

 

 

 

우측 상단 , 물리 Layer 하나 추가

 

이름은 Enemy

그리고 하나더, EnemyDead

 

Test Enemy 오브젝트 레이어를 Enemy 로 설정

 


edit - project settings - physics - settings
layer collision matrix 
EnemyDead 는 Wall, Floor, EnemyDead 만 남기기

 

 

 

EnemyDead 레이어 번호를 기억하자

 

강의에선 14번인데, 사람마다 숫자가 다를 수 있음 (나는 12번이었음)

 

            gameObject.layer = 12;

이 오브젝트의 피직스 레이어를 12번으로 바꾸겠다는 뜻

 

 

 

+

 

 

후처리 더 다듬어보자

 

 

    void OnTriggerEnter(Collider other)
   	{
          Vector3 reactVec = transform.position
           - other.transform.position;
                       StartCoroutine(OnDamage(reactVec));
         }
         
         
           IEnumerator OnDamage(Vector3 reactVec)
  {

          reactVec = reactVec.normalized;
          reactVec += Vector3.up;
          rigid.AddForce(reactVec * 5, ForceMode.Impulse);
}

 

충돌을 받을 때,

공격한 반대 방향으로 넉벡을 주겠다는 뜻

 

vector3 up 은 위쪽으로 튀어 오르겠다는 뜻

애드 포스도 있으니 위로도 튀고 뒤쪽으로도 튄다는 뜻

 

+

 

 

댓글 정보 추

 


휘두른거랑 데미지 들어가는거랑 안 맞을 때
: Swing 코루틴에서 맨위의 waitforSeconds를 0.4초 정도로 하면 됩니다. 

아마 애니메이션과 딜레이가 좀 안맞아서 그런것 같습니다. 저는 0.45 /0.1/ 0.3으로 했습니다

 

 

반응형
Posted by 이름이 익명
: