회전 포신
enum을 통해 RotateState 지정
GetButton 이용하기
- 자세한 Input 내용은 InputManager 가서 확인, 수정 가능
Edit - Project Settings - Input
회전 전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShooterRotator : MonoBehaviour
{
private enum RotateState
{
Idle, Vertical, Horizontal, Ready
}
private RotateState state=RotateState.Idle;
public float verticalRotateSpeed = 360f;
public float horizontalRotateSpeed = 360f;
void Update()
{
if(state==RotateState.Idle) //아무것도 안한 대기상태
{
if(Input.GetButtonDown("Fire1"))//누르는 한 순간, Fire: InputManager 보기
{
state = RotateState.Horizontal;
}
}
else if (state == RotateState.Horizontal)
{
if (Input.GetButton("Fire1")) //계속 누르고 있을 때
{
transform.Rotate(new Vector3(0, horizontalRotateSpeed
* Time.deltaTime, 0));
}else if(Input.GetButtonUp("Fire1")) //손을 뗀 순간
{
state = RotateState.Vertical;
}
}
else if(state==RotateState.Vertical)
{
if(Input.GetButton("Fire1"))
{
transform.Rotate(new Vector3(- verticalRotateSpeed * Time.deltaTime, 0, 0));
}
else if(Input.GetButtonUp("Fire1"))
{
state = RotateState.Ready;
}
}
}
}
switch로 정리한 더 깔끔한 코드
void Update()
{
switch(state)
{
case RotateState.Idle:
if (Input.GetButtonDown("Fire1"))//누르는 한 순간, Fire: InputManager 보기
{
state = RotateState.Horizontal;
}
break;
case RotateState.Horizontal:
if (Input.GetButton("Fire1")) //계속 누르고 있을 때
{
transform.Rotate(new Vector3(0, horizontalRotateSpeed
* Time.deltaTime, 0));
}
else if (Input.GetButtonUp("Fire1")) //손을 뗀 순간
{
state = RotateState.Vertical;
}
break;
case RotateState.Vertical:
if (Input.GetButton("Fire1"))
{
transform.Rotate(new Vector3(-verticalRotateSpeed * Time.deltaTime, 0, 0));
}
else if (Input.GetButtonUp("Fire1"))
{
state = RotateState.Ready;
}
break;
case RotateState.Ready:
break;
}
}
포탄
*Ball 만들어주기
1) Is Trigger : 물리적 표면 없애주고 충돌 그 자체만 체크하는 것
Is Trigger 체크 안되어있으면 다른 물체에 부딪혔을 때 튕겨나갈 수가 있음
Ball이 발사되서 날라가려면 물리 기능을 가지고 있어야 함.
2) RigidBody가 필요
3) 폭발 효과 (특수효과) + 폭발 오디오
4) Ball Scripts
① 물체의 표면에 닿았을 때 파티클 효과 재생 + 사라짐(스스로 파괴)
- Ball이 파괴 되는 순간 자식에 있는 파티클도 사라지면 안되니까
Ball이 파괴되는 순간 자기 자식에 있는 특수효과 오브젝트를 자기 자신에게서 해제하는 코드를 써야함
- 파티클이 재생된 후 남아있으면 메모리 낭비니까 충분히 재생시켜준 후 파티클도 파괴하기
: 지연시간 주기
Ball Scripts
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
public ParticleSystem explosionParticle;
public AudioSource explosionAudio;
public float maxDamage = 100f;
public float explosionForce = 1000f;
public float lifeTime = 10f;
public float explosionRadius = 20f;
void Start()
{
Destroy(gameObject,lifeTime); //자기자신(gameObject) 파괴
}
private void OnTriggerEnter(Collider other)
{
//부모 자식 관계는 transform이 관리함
explosionParticle.transform.parent = null;
explosionParticle.Play();
explosionAudio.Play();
Destroy(explosionParticle.gameObject, explosionParticle.duration); //파티클 파괴
Destroy(gameObject); //자기자신 파괴
}
}
② 자기 주변의 물건들 감지해서 파괴하기
'Unity' 카테고리의 다른 글
Package Manager에 Preview 버전이 안보인다면? (0) | 2021.07.16 |
---|---|
프롭 + 데미지 시스템 , Instantiate(), Tag & Layer , Physics (0) | 2021.07.15 |
코루틴 (0) | 2021.07.13 |
UI / 오디오 / 최종빌드 (0) | 2021.07.13 |
싱글톤 (0) | 2021.07.13 |
댓글