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(); impluse = GetComponent(); muzzleFlash = firePos.GetComponentInChildren(); 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) */