-
Notifications
You must be signed in to change notification settings - Fork 2
develop KingBible
Yoo Hyeokjin edited this page Jul 6, 2023
·
2 revisions
- 주인공 주위를 공전하는 투사체이다. 자세한 설명은 성서에서 알 수 있다.
- 성서를 구현할 때는 쿨타임이 지나면 instance를 생성하고 지속시간이 지나면 instance를 삭제하는 식으로 구현할 것이다.
- 주인공을 공전해야 하기 때문에 transform.RotateAround를 사용하려 했지만 속도를 조절하며 해당 함수를 사용하면 무기의 회전이 이상했다.
이어서 구상한 방법은 하나의 instance를 생성하여 그 instance를 transfrom.Rotate로 자체를 회전시키며 그 안에 성서들의 배치를 일정하게 해준다고 생각하여 구현했다.
- 코드를 보면 알겠지만 Weapon들은 Weapon.cs를 상속받아서 만들었고 해당 Weapon의 스텟을 WeaponTotalStats[((int)Enums.EWeaponStat.원하는 Stat)]으로 가져올 수 있다.
using UnityEngine;
public class KingBible : Weapon
{
private GameObject mNewObj; // 생성한 instance를 저장할 변수
private bool mbExist = false; // 생성되었는지 삭제되었는지 확인할 변수
private float mDistance = 4f; // 오브젝트와 타겟 사이의 거리
private float mSpeed = 120f; // 공전 속도
private float mTimer = 0; // 쿨타임과 지속시간을 체크할 타이머 변수
private void Update()
{
transform.parent.transform.position = GameManager.instance.Player.transform.position; // KingBible을 담을 parent instance가 Player 좌표와 일치해야 한다.
transform.parent.transform.Translate(Vector3.down); // 예쁜 회전을 위해 instance 위치 조정
transform.parent.transform.Rotate(Vector3.back * mSpeed * WeaponTotalStats[((int)Enums.EWeaponStat.ProjectileSpeed)] * Time.deltaTime / WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]);
// KingBible을 담을 parent instance 자체를 회전(일정 속도 * WeaponStat * 시간 동기화 / 성서 개수)
}
public override void Attack()
{
GameObject objPre; // SkillFiringSystem에 저장한 Weapon Prefab을 저장할 지역 변수
if (IsEvoluction())
objPre = SkillFiringSystem.instance.evolutionWeaponPrefabs[WeaponIndex]; // 진화 Weapon
mbExist = false; // 진화시 지속시간을 생각하지 않고 개별로 쿨타임만 지나면 instance가 생성되도록 하는 코드
else
objPre = SkillFiringSystem.instance.weaponPrefabs[WeaponIndex]; // 일반 Weapon
if(!mbExist && mTimer > WeaponTotalStats[((int)Enums.EWeaponStat.Cooldown)])
{ // KingBible이 존재하지 않고 쿨타임을 넘겼다면
mNewObj = new GameObject("KingBibles"); // KingBible을 담을 parent instance 생성
mNewObj.transform.parent = GameObject.Find("SkillFiringSystem").transform; // SkillFiringSystem의 자식으로 해당 instance를 넣는다.
for (int i = 0; i < WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]; i++) // KingBible 투사체 수를 만큼 parent instance에 추가한다.
{
GameObject kingBible = Instantiate(objPre); // 가져온 Prefab의 instance를 생성
kingBible.transform.parent = GameObject.Find("KingBibles").transform; // KingBibles의 자식으로 해당 instance를 넣는다.
Vector3 rotVec = Vector3.forward * 360 * i / WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]; // KingBible의 개수만큼 원에서 나눠서 좌표 계산
kingBible.transform.Rotate(rotVec); // 해당 좌표로 이동
kingBible.transform.Translate(kingBible.transform.up * mDistance, Space.World); // Player에서 공격 범위만큼 떨어뜨림
}
mbExist = true; // KingBible이 존재함을 저장
mTimer = 0; // 지속시간 확인을 위한 초기화
}
else if (mbExist && mTimer > WeaponTotalStats[((int)Enums.EWeaponStat.Duration)])
{
Destroy(mNewObj); // KingBible instance가 존재한다면 삭제
mbExist = false; // KingBible이 존재하지 않음을 저장
mTimer = 0; // 쿨타임 확인을 위한 초기화
}
mTimer += Time.deltaTime;
}
public override void EvolutionProcess() // 무기 진화시 한 번 호출됨
{
}
}
다음의 Component를 추가한다.
- Animator
- SpriteRenderer
- Rigidbody2D
- BoxCollider2D
- KingBible.cs
다음과 같이 Prefab을 만들어 준다.