유니티 공부.. 피격 테스터 만들기
unity 유니티 공부 2024. 12. 11. 17:04 |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으로 했습니다