본문 바로가기
Unity

회전 포신, 포탄 만들기

by imagineer_jinny 2021. 7. 15.

회전 포신

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

댓글