728x90
Scriptable Object : 유니티 프로젝트의 에셋 형태로 데이터를 담을 수 있는 타입
GunData.cs 생성
using UnityEngine;
[CreateAssetMenu(menuName = "Scriptable/GunData", fileName = "GunData")]
public class GunData : ScriptableObject
{
public AudioClip shotClip; // 발사 소리
public AudioClip reloadClip; // 재장전 소리
public float damage = 25; // 공격력
public int startAmmoRemain = 100; // 처음에 주어진 전체 탄알
public int magCapacity = 25; // 탄창 용량
public float timeBetFire = 0.12f; // 탄알 발사 간격
public float reloadTime = 1.8f; // 재장전 소요 시간
}
- GunData가 스크립터블 오브젝트로 동작할 수 있도록 GunData 클래스가 ScriptableObject 클래스를 상속하도록 함
- 유니티의 에셋 생성 메뉴에서 GunData 타입의 에셋을 생성하는 메뉴를 만들기 위해 특성을 클래스에 추가하였음 (대괄호 부분)
- 특성은 어떤 클래스나 메서드, 변수 등에 대한 추가 정보를 제공하는 C#문법
- 사용할 특성 이름을 대괄호로 묶고, 필요에 따라 추가 값을 전달
- CreateAssetMenu 특성은 해당 타입의 에셋을 생성할 수 있는 버튼을 Assets와 Create(+버튼) 메뉴에 추가함
- [CreateAssetMenu(menuName = "메뉴 경로", fileName = "기본 파일명, order = 메뉴 상에서 순서")]
새 폴더 생성
폴더 안에 Scriptable - GunData 생성!
이름은 Uzi
Shot Clip, Reload Clip 할당해 줌
Gun.cs 생성
Gun에 할당
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 총을 구현
public class Gun : MonoBehaviour
{
// 총의 상태를 표현하는데 사용할 타입을 선언
public enum State
{
Ready, // 발사 준비됨
Empty, // 탄창이 빔
Reloading // 재장전 중
}
public State state { get; private set; } // 현재 총의 상태
public Transform fireTransform; // 탄알이 발사될 위치
public ParticleSystem muzzleFlashEffect; // 총구 화염 효과
public ParticleSystem shellEjectEffect; // 탄피 배출 효과
private LineRenderer bulletLineRenderer; // 탄알 궤적을 그리기 위한 렌더러
private AudioSource gunAudioPlayer; // 총 소리 재생기
public GunData gunData; // 총의 현재 데이터
private float fireDistance = 50f; // 사정거리
public int ammoRemain = 100; // 남은 전체 탄알
public int magAmmo; // 현재 탄창에 남아 있는 탄알
private float lastFireTime; // 총을 마지막으로 발사한 시점
private void Awake()
{
// 사용할 컴포넌트의 참조 가져오기
}
private void OnEnable()
{
// 총 상태 초기화
}
// 발사 시도
public void Fire()
{
}
// 실제 발사 처리
private void Shot()
{
}
// 발사 이펙트와 소리를 재생하고 탄알 궤적을 그림
private IEnumerator ShotEffect(Vector3 hitPosition)
{
// 라인 렌더러를 활성화하여 탄알 궤적을 그림
bulletLineRenderer.enabled = true;
// 0.03초 동안 잠시 처리를 대기
yield return new WaitForSeconds(0.03f);
// 라인 렌더러를 비활성화하여 탄알 궤적을 지움
bulletLineRenderer.enabled = false;
}
// 재장전 시도
public bool Reload()
{
return false;
}
// 실제 재장전 처리를 진행
private IEnumerator ReloadRoutine()
{
// 현재 상태를 재장전 중 상태로 전환
state = State.Reloading;
// 재장전 소요 시간만큼 처리 쉬기
yield return new WaitForSeconds(gunData.reloadTime);
// 총의 현재 상태를 발사 준비된 상태로 변경
state = State.Ready;
}
}
'Hello, World! > Unity' 카테고리의 다른 글
유니티 3D 좀비 서바이벌 게임 만들자 (12) / Raycast 레이캐스트 (0) | 2022.04.19 |
---|---|
유니티 3D 좀비 서바이벌 게임 만들자 (11) (0) | 2022.04.18 |
유니티 3D 좀비 서바이벌 게임 만들자 (9) (0) | 2022.04.14 |
유니티 3D 좀비 서바이벌 게임 만들자 (8) (0) | 2022.04.13 |
유니티 3D 좀비 서바이벌 게임 만들자 (7) + 이벤트 함수 순서 (0) | 2022.04.12 |
댓글