https://www.youtube.com/watch?v=esGkgvm9eSg&list=PLO-mt5Iu5TeYkrBzWKuTCl6IUm_bA6BKy&index=5
1. 변수 생성
●탄약, 동전, 체력, 수류탄(필살기) 변수 생성 (각 수치의 최대값을 저장할 변수도 생성)
public class Player : MonoBehaviour
{
...
public int ammo;
public int coin;
public int health;
public int hasGrenades;
public int maxAmmo;
public int maxCoin;
public int maxHealth;
public int maxHasGrenades;
...
}
▷인스펙터 창에서 초기값 설정
2. 아이템 입수
◆OnTriggerEnter()에서 트리거 이벤트 작성
●enum 타입변수 + switch문으로 간단명료하게 조건문 생성
●enum 타입에 맞게 아이템 수치를 플레이어 수치에 적용하기
●플레이어 수치가 최대값을 넘지 않도록 로직 추가
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == "Item")
{
Item item = other.GetComponent<Item>();
switch (item.type)
{
case Item.Type.Ammo:
ammo += item.value;
if(ammo > maxAmmo)
ammo = maxAmmo;
break;
case Item.Type.Coin:
coin += item.value;
if (coin > maxCoin)
coin = maxCoin;
break;
case Item.Type.Heart:
health += item.value;
if (health > maxHealth)
health = maxHealth;
break;
case Item.Type.Grenade:
hasGrenades += item.value;
if (hasGrenades > maxHasGrenades)
hasGrenades = maxHasGrenades;
break;
}
Destroy(other.gameObject);
}
}
▷Destroy를 통해 먹은 오브젝트 삭제
3. 공전 물체 만들기
●공전하는 물체를 컨트롤하기 위해 배열변수 생성
public GameObject[] grenades;
●빈 오브젝트에 4방향으로 공전할 오브젝트 생성
▷Create Empty로 Granade Group 생성 후 Create Empty로 동서남북 생성 후 플레이어 주변으로 위치 초기화
●씬에서 안보이는 것은 인스펙터 창의 정육면체를 눌러 색을 부여해준다.
●4방향으로 공전 오브젝트에 수류탄 프리펩 추가(z=30)
●공전 수류탄 프리펩에 Weapon Granade Oribt을 추가해서 드랍 아이템과 다르게 재질 변경
●Rate of Distance : 파티클의 위치 변화에 따라 입자 생성
●파티클이 물체와 같이 움직이는 문제점
▷Simulation Space 를 local 에서 World로 교체하면 된다.
4. 공전 구현
●Orbit 스크립트 4방향 공전 오브젝트에 스크립트 추가
●공전 목표, 공전 속도, 목표와의 거리 변수 생성
public class Orbit : MonoBehaviour
{
public Transform target;
public float orbitSpeed;
Vector3 offset;
}
●회전을 하는 함수 작성
void Update()
{
transform.RotateAround(
target.position, Vector3.up,
orbitSpeed * Time.deltaTime);
}
▷RotateAround(회전 좌표, 회전 축, 회전 수치) : 타겟 주위를 회전하는 함수
※ RotateAround()는 목표가 움직이면 일그러지는 단점이 있음
●offset을 통해 RotateAround을 보정하기
void Start()
{
offset = transform.position - target.position;
}
// Update is called once per frame
void Update()
{
transform.position = target.position + offset;
transform.RotateAround(
target.position, Vector3.up,
orbitSpeed * Time.deltaTime);
offset = transform.position - target.position;
}
▷offset으로 플레이어를 따라가게 만듬
▷RotateAround() 후의 position을 offset에 넣어주어 목표와의 거리를 유지
●안에 있는 각 수류탄들을 플레이어 수류탄 배열 변수에 할당
●안에 있는 각 수류탄들을 인스펙터 창에서 비활성화
●Player 스크립트를 수류탄 개수대로 공전체가 활성화 되도록 구현
private void OnTriggerEnter(Collider other)
{
...
switch (item.type)
{
...
case Item.Type.Grenade:
grenades[hasGrenades].SetActive(true);
hasGrenades += item.value;
if (hasGrenades > maxHasGrenades)
hasGrenades = maxHasGrenades;
break;
}
...
}
}
깃허브 올리기
Commit : ver 1.5
Description : Item Orbit
'게임개발 > 3D_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_골드메탈_3D] 4. 드랍 무기 입수와 교체 (0) | 2023.07.07 |
---|---|
[클론코딩_골드메탈_3D] 3. 아이템 만들기 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 2. 플레이어 점프와 회피 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 1. 플레이어 이동 (0) | 2023.07.02 |