https://www.youtube.com/watch?v=HPJVVcRKwn0&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=10
1. 프리팹 만들기
스프라이트 폴더의 Props의 Bullet 0 씬창에 배치
총알 담당 스크립트(Bullet) 생성
데미지와 관통 변수 그리고 초기화 함수 선언
public class Bullet : MonoBehaviour
{
//프리펩 친구들은 변수 초기화를 하는게 좋다
public float damage;
public int per;
public void Init(float daamage,int per)
{
this.damage = daamage;
this.per = per;
}
}
- this : 해당 클래스의 변수로 접근
스크립트를 컴포넌트로 활용 및 Box Collider 2D 추가
Is Trigger 체크
프리펩 폴더로 드래그드랍하여 프리펩 으로 등록
2. 충돌 로직 작성
Enemy 스크립트에 OnTriggerEnter2D 함수 추가
private void OnTriggerEnter2D(Collider2D collision)
{
if (!collision.CompareTag("Bullet"))
return;
health -= collision.GetComponent<Bullet>().damage;
if (health > 0)
{
// .. Live, Hit Action
}
else
{
// Dead
Dead();
}
}
- OnTriggerEnter2D 매개변수의 태그를 조건으로 활용
- Bullet 컴포넌트로 접근하여 데미지를 가져와 피격 계산하기
- 남은 체력을 조건으로 피격과 사망으로 로직을 나누기
- 사망할 땐 SetActive 함수를 통한 오브젝트 비활성화(오브젝트 풀링을 썻기 때문에 파괴하면 안된다.)
void Dead()
{
gameObject.SetActive(false);
}
3. 근접무기 생성
근접무기 프리펩을 풀 매니저에 등록(0번 Enemy, 1번 Bullet 0)
플레이어에 Create Empty(Weapon 0) 생성
무기 생성 및 관리를 담당하는 스크립트(Weapon) 생성 후 오브젝트에 등록
Weapon 스크립트 무기ID, 프리펩 ID, 데미지, 개수, 속도 변수 선언
public class Weapon : MonoBehaviour
{
public int id;
public int prefabId;
public float damage;
public int count;
public float speed;
}
초기화 하는 Init 함수
public void Init()
{
switch (id)
{
case 0:
speed = -150;
Batch();
break;
default:
break;
}
}
- 무기 ID에 따라 로직을 분리할 switch 문 작성
- 마이너스로 해야 시계방향으로 돈다
Batch(배치하는) 함수 생성
void Batch()
{
for (int index = 0; index < count; index++)
{
Transform bullet = GameManager.instance.pool.Get(prefabId).transform;
bullet.parent = transform;
bullet.GetComponent<Bullet>().Init(damage, -1); // -1 is Infinity Per.
}
}
- 하드코딩이 아닌 prefabId 사용
- 가져온 오브젝트의 Transform을 지역변수로 저장
- parent 속성을 통해 부모 변경
- Bullet 컴포넌트 접근하여 속성 초기화 함수 호출
- -1 같은 것은 주석을 쓰면 좋다
- start에 Init 실행
private void Start()
{
Init();
}
무기 관리 오브젝트의 속성을 수동으로 설정
Update 수정(회전)
void Update()
{
switch (id)
{
case 0:
transform.Rotate(Vector3.back * speed * Time.deltaTime);
break;
default:
break;
}
// ..Test Code..
if (Input.GetButtonDown("Jump"))
{
LevelUp(20, 5);
}
}
- Vector3.forward * -1 = Vector3.back
근접 무기 프리펩의 Order in Layer를 몬스터보다 높이기(3)
4. 근접무기 배치 2
회전 이후 자신의 위쪽 방향으로 이동하는 것이 포인트
Weapon 스크립트의 Batch 함수의 회전 Vector3 만들기
//회전 코드
Vector3 rotVec = Vector3.forward * 360 * index / count;
bullet.Rotate(rotVec);
bullet.Translate(bullet.up * 1.5f, Space.World);
- Rotate 함수로 계산된 각도 적용
- Translate 함수로 자신의 위쪽으로 이동
- 이동 방향은 Space.World 기준으로
5. 레벨에 따른 배치
레벨업 기능 함수 작성
public void LevelUp(float damage, int count)
{
this.damage = damage;
this.count += count;
if(id == 0)
{
Batch();
}
}
테스트 레벨업 작성
// ..Test Code..
if (Input.GetButtonDown("Jump"))
{
LevelUp(20, 5);
}
- 점프를 누르면 20데미지의 개수는 5 추가
문제점
1. 원하는 것 보다 더 많이 추가된 무기들
2. 위치가 잘못 된 점
2번 문제 Batch 함수에 위치, 회전을 초기화 하기
bullet.localPosition = Vector3.zero;
bullet.localRotation = Quaternion.identity;
- Quaternion.identity : 쿼터니안의 초기값
1번 문제 해결
for (int index = 0; index < count; index++)
{
Transform bullet;
//
if (index < transform.childCount)
{
bullet = transform.GetChild(index);
}
else
{
bullet = GameManager.instance.pool.Get(prefabId).transform;
bullet.parent = transform;
}
bullet.parent = transform;
...
- 자신의 자식 오브젝트 개수 확인은 childCount 속성
- 기존 오브젝트를 먼저 활용하고 모자란 것은 풀링에서 가져오기
- bullet.parent = transform : 부모 바꾸기
void Batch()
{
for (int index = 0; index < count; index++)
{
Transform bullet;
//
if (index < transform.childCount)
{
bullet = transform.GetChild(index);
}
else
{
bullet = GameManager.instance.pool.Get(prefabId).transform;
bullet.parent = transform;
}
bullet.parent = transform;
bullet.localPosition = Vector3.zero;
bullet.localRotation = Quaternion.identity;
//회전 코드
Vector3 rotVec = Vector3.forward * 360 * index / count;
bullet.Rotate(rotVec);
bullet.Translate(bullet.up * 1.5f, Space.World);
bullet.GetComponent<Bullet>().Init(damage, -1); // -1 is Infinity Per.
}
}
깃허브 올리기
Commit : ver 1.7
Description : Spinning Melee Weapon
https://github.com/mekain80/CloneCode_Undead_Survivor
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 9 (타격감🌟있는 몬스터 처치 만들기) (0) | 2023.05.06 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현) (0) | 2023.04.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기) (0) | 2023.04.09 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기) (0) | 2023.04.09 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 5 (몬스터🧟만들기) (0) | 2023.04.07 |