KNU_SpaceShooter/Assets/02_Scripts/WeaponController.cs
2024-09-12 16:17:21 +09:00

94 lines
2.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Cinemachine;
using System;
using Random = UnityEngine.Random;
[RequireComponent(typeof(AudioSource))]
public class WeaponController : MonoBehaviour
{
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private Transform firePos;
[SerializeField] private AudioClip fireSfx;
private CinemachineImpulseSource impluse;
private new AudioSource audio;
private MeshRenderer muzzleFlash;
void Start()
{
audio = GetComponent<AudioSource>();
impluse = GetComponent<CinemachineImpulseSource>();
muzzleFlash = firePos.GetComponentInChildren<MeshRenderer>();
muzzleFlash.enabled = false;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// 총알 생성 : bulletPrefab을 왼쪽 마우스 버튼 클릭할 때 마다 생성
// Instantiate(생성할프리팹, 위치, 각도)
Instantiate(bulletPrefab, firePos.position, firePos.rotation);
// 총소리 사운드 재생
audio.PlayOneShot(fireSfx, 0.8f);
// 타격감 연출
impluse.GenerateImpulse();
StartCoroutine(ShowMuzzleFlash());
}
}
IEnumerator ShowMuzzleFlash()
{
//MuzzleFlash 활성화
muzzleFlash.enabled = true;
// 텍스처의 Offset 값을 추출 (0, 0), (0.5, 0), (0.5, 0.5), (0, 0.5) => 0, 0.5
// 난수 발생
/*
Random.Range(0, 10) : 0, 1, 2, ..., 9
Random.Range(0.0f, 10.0f) : 0.0f ~ 10.0f
*/
Vector2 offset = new Vector2(Random.Range(0, 2), Random.Range(0, 2)) * 0.5f;
// 텍스처의 오프셋 변경
muzzleFlash.material.mainTextureOffset = offset;
// 스케일 변경
Vector3 scale = Vector3.one * Random.Range(1.0f, 3.0f);
muzzleFlash.transform.localScale = scale;
// Euler 오일각을 쿼터니언 타입으로 변환
Quaternion rot = Quaternion.Euler(Vector3.forward * Random.Range(0, 360));
muzzleFlash.transform.localRotation = rot;
// Waiting...
yield return new WaitForSeconds(0.2f);
//MuzzleFlash 비활성화
muzzleFlash.enabled = false;
}
}
/*
Co-routine 코루틴 <> 멀티 스레드
*/
/*
NPC AI - 유한상태머신(Finite State Machine : FSM)
*/