지난번에 이어 게임을 만들어보자.
이번에 참고할 강의는 아래 강의이다.
https://www.youtube.com/watch?v=e1XO53GA7xM&list=PLFt_AvWsXl0ctd4dgE1F8g3uec4zKNRV0&index=17
이번 강의에서는 무기 발사 이펙트를 추가해본다.
시작해보자.
총에서 총알을 발사 할 때 Muzzle Flash 효과와 탄피 배출 효과를 추가해보자.
먼저 만들어둔 총 프리팹을 씬으로 가져오자.
탄피가 배출될 위치에 Shell Ejection Point 오브젝트를 생성하고 위치와 각도를 조정한다.
이제 프리팹을 저장하고 씬에서 삭제하자.
탄피 프리팹을 만들기 위해 총알 프리팹 Bullet 을 씬으로 가져온다음
이름을 Shell 로 바꾸고 새 프리팹으로 추가한다.
Shell 프리팹에는 Projectile 스크립트 컴포넌트를 제거하고
새로운 스크립트 Shell 을 만들어서 할당해준다.
리지드바디와 박스 콜라이더 컴포넌트도 추가해서 충돌, 중력 등 물리 효과를 받도록 설정하자.
머터리얼에서 총알 머터리얼을 복제해 Shell 로 바꿔주고
렌더링 모드를 Fade 로 설정해준다.
이제 Shell 프리팹에 머터리얼을 적용해주자.
이제 Shell, Gun 스크립트를 수정하자.
| Shell 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shell : MonoBehaviour
{
public Rigidbody myRigidbody; // 리지드바디 레퍼런스
public float forceMin; // 가해지는 힘 최소값
public float forceMax; // 가해지는 힘 최대값
float lifeTime = 1; // 탄피 유지 시간
float fadeTime = 1; // 탄피 사라지는 모션 시간
void Start() {
float force = Random.Range(forceMin, forceMax); // 가해지는 힘 범위내에서 랜덤으로 설정
myRigidbody.AddForce(transform.right * force); // 리지드바디를 통해 우측면으로 힘 전달
myRigidbody.AddTorque(Random.insideUnitSphere * force); // 단위 구체 내부에 랜덤 값을 곱해 랜덤 회전을 준다.
StartCoroutine(Fade()); // 페이드 아웃 효과 코루틴 실행
}
// ■ 탄피 페이드 아웃 코루틴
IEnumerator Fade() {
yield return new WaitForSeconds(lifeTime); // lifeTime 후에 실행.
float percent = 0; // 페이드 아웃 효과 퍼센트
float fadeSpeed = 1 / fadeTime; // 페이드 아웃 효과 시간
Material mat = GetComponent<Renderer>().material; // 머터리얼 레퍼런스
Color initialColour = mat.color; // 기존 색상 저장
while (percent < 1) { // 페이드 아웃 효과가 끝나지 않았다면
percent += Time.deltaTime * fadeSpeed; // 페이드 아웃 효과 퍼센트 계산
mat.color = Color.Lerp(initialColour, Color.clear, percent); // 탄피 색상 설정
yield return null; // 다음 프레임 이후 반복
}
Destroy(gameObject); // 이 오브젝트 파괴
}
}
| Gun 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour
{
public Transform muzzle; // 총알 발사 위치
public Projectile projectile; // 총알
public float msBetweenShots = 100; // 총알 발사 시간 간격
public float muzzleVelocity = 35; // 총알 발사 속도
public Transform shell; // 탄피 레퍼런스
public Transform shellEjection; // 탄피 배출 위치 레퍼런스
float nextShotTime; // 다음 총알 발사 시간
public void Shoot() // 총알 발사 메소드
{
if(Time.time > nextShotTime) // 총알 발사 시간이 지났는지 확인
{
nextShotTime = Time.time + msBetweenShots / 1000; // 다음 총알 발사 시작 시간 저장
Projectile newProjectile = Instantiate(projectile, muzzle.position, muzzle.rotation) as Projectile;
// 총알 프리팹을 통해 오브젝트를 인스턴스화 하여 생성.
newProjectile.SetSpeed(muzzleVelocity); // 총알 발사 속도 설정
Instantiate(shell, shellEjection.position, shellEjection.rotation); // 탄피 인스턴스화 하여 생성
}
}
}
이제 Shell 프리팹의 Shell 스크립트에 있는 RigidBody, forceMin, forceMax 를 설정한다.
그리고 Gun 프리팹의 Gun 스크립트에서 Shell 과 Shell Ejecion 트랜스폼도 할당해주자.
이제 실행해보자.
총을 발사할 때 탄피가 옆으로 떨어지는 것을 볼 수 있다.
다음으로는 총구 화염 효과를 추가해보자.
유튜브 강의 링크를 통해 다운받은 이미지를 프리팹 폴더에 드래그 해 넣는다.
인스펙터에서 텍스쳐 타입, 스프라이트 모드, 물리 모양 생성을 설정하고 스프라이트 편집기를 연다.
아... 패키지 관리자로 가서 2D 스프라이트 패키지를 받아주자..
다시 편집기를 열고
분할 타입을 설정해주고 각 셀 크기를 설정하고 분할 버튼을 눌러 원하는 크기로 잘라준다.
그럼 위와 같이 4개의 이미지가 생긴다.
이제 Gun 프리팹을 다시 씬에 놓고,
Projectile Spawn 오브젝트의 아래에 MuzzleFlash 오브젝트를 생성해 그 아래에 첫 번째 이미지를 넣어주자.
이미지의 사이즈와 위치를 조절해 총구 위치에 놓고, 복제해서 x 축 회전시켜 놓자.
위와 같은 모양이 된다.
이제 MuzzleFlash 스크립트를 만들고 작성하자.
| MuzzleFlash 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MuzzleFlash : MonoBehaviour
{
public GameObject flashHolder; // 화염 효과 오브젝트 레퍼런스
public Sprite[] flashSprites; // 화염 효과 스프라이트 배열
public SpriteRenderer[] spriteRenderer; // 화염 효과 스프라이트 렌더러 배열
public float flashTime; // 화염 효과 지속 시간
// ■ 화염 효과 활성화 메소드
public void Activate() {
flashHolder.SetActive(true); // 화염 효과 오브젝트 활성화
int flashSpriteIndex = Random.Range(0, flashSprites.Length); // 스프라이트 인덱스 랜덤 지정
for(int i = 0; i < spriteRenderer.Length; i++) {
spriteRenderer[i].sprite = flashSprites[flashSpriteIndex]; // 랜덤 스프라이트 적용
}
Invoke("Deactivate", flashTime); // 지정한 시간 후 Deactivate 메소드 호출
}
// ■ 화염 효과 비활성화 메소드
void Deactivate() {
flashHolder.SetActive(false); // 화염 효과 오브젝트 비활성화
}
}
Gun 스크립트에도 코드를 추가하자.
| Gun 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour
{
public Transform muzzle; // 총알 발사 위치
public Projectile projectile; // 총알
public float msBetweenShots = 100; // 총알 발사 시간 간격
public float muzzleVelocity = 35; // 총알 발사 속도
public Transform shell; // 탄피 레퍼런스
public Transform shellEjection; // 탄피 배출 위치 레퍼런스
MuzzleFlash muzzleFlash; // 총구 화염 레퍼런스
float nextShotTime; // 다음 총알 발사 시간
void Start() {
muzzleFlash = GetComponent<MuzzleFlash>(); // 총구 화염 레퍼런스 할당
}
public void Shoot() // 총알 발사 메소드
{
if(Time.time > nextShotTime) // 총알 발사 시간이 지났는지 확인
{
nextShotTime = Time.time + msBetweenShots / 1000; // 다음 총알 발사 시작 시간 저장
Projectile newProjectile = Instantiate(projectile, muzzle.position, muzzle.rotation) as Projectile;
// 총알 프리팹을 통해 오브젝트를 인스턴스화 하여 생성.
newProjectile.SetSpeed(muzzleVelocity); // 총알 발사 속도 설정
Instantiate(shell, shellEjection.position, shellEjection.rotation); // 탄피 인스턴스화 하여 생성
muzzleFlash.Activate(); // 총구 화염 생성
}
}
}
이제 MuzzleFlash 스크립트를 Gun 프리팹에 넣고, 인스펙터에서 할당을 해주자.
FlashHolder 에 MuzzleFlash 오브젝트를,
Flash Sprite 에는 위에서 분할해놓은 이미지들을,
스프라이트 렌더러에는 MuzzleFlash 01, 02 오브젝트를 할당한다.
Flash Time 은 0.05 정도로 설정해주자.
화염 효과에 빛을 추가하자.
Muzzle Flash 오브젝트의 아래에 빈 오브젝트 를 생성하고, 광원(Light) 컴포넌트를 추가한다.
범위, 강도, 컬러를 설정해주자.
이제 Muzzle Flash 오브젝트를 비활성화 하고 Gun 오브젝트를 씬에서 삭제하자.
총알을 발사 할 때 생성되는 탄피들은 여러 곳에서 충돌이 발생하게된다.
탄피끼리도 충돌이 발생하는데, 생성되는 탄피가 많은 만큼 충돌 연산이 컴퓨터에 영향을 줄 수도 있다.
최적화를 위해 탄피끼리의 충돌을 비활성화 해보자.
레이어에 Shell 이라는 레이어를 추가하고 탄피 프리팹에 적용해준다.
이제 편집(Edit) - 프로젝트 설정(Project Setting) - 물리(Physics) 로 이동하자.
아래로 내려서 Shell 레이어의 충돌할 오브젝트들의 체크를 해제해주자.
바닥과 장애물 정도만 체크하면 된다.
게임을 실행해보자.
총을 쏘면 탄피가 떨어지고 총구에서 화염 효과가 나타난다.
이제 다음 강의에서는 여러 무기를 사용할 수 있게 해보자.
'Unity > 게임개발' 카테고리의 다른 글
[Unity] 게임 개발 일지 | 탑다운 슈팅 18 (0) | 2023.12.11 |
---|---|
[Unity] 게임 개발 일지 | 탑다운 슈팅 17 (0) | 2023.12.08 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 15 (2) | 2023.12.06 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 14 (0) | 2023.12.06 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 13 (2) | 2023.12.05 |