본문 바로가기

유니티

2D 총알구현,발사

반응형
반응형

이번 포스팅에서는 총알을 구현하고 발사하는거 까지 해보겠다.

일단 본격적으로 스크립트를 수정하기에 앞서서 Edit->ProjectSettings->Input Manager에 들어가서 아래사진과 같이 Fire1버튼을 A로 설정해주자. 나는 이번 프로젝트에서 총알 발사 버튼을 A로 해줄꺼여서 아래처럼 설정했으므로 자기가 편한대로 해도 무방하다.

이제 스크립트를 설명하겠다 스크립트를 설명하기에 앞서서, 이전 포스팅과 스크립타가 많이 달라졌다.

위에 사진을 보면 알겠지만 부모오브젝트를 Helmet으로 두고 자식오브젝트에 weapons를 넣었다.

그래서 Player.cs 에서 Weapone.cs 스크립트를 불러서 왼쪽방향키를 누를땐 캐릭터를 기준으로 왼쪽에 위치하고 왼쪽으로 총구를향하게 했다. 바뀐 코드는 아래와 같다. 자세한 설명은 아래를 보며 이해하도록 하자.

 

 

Player.cs 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private Weapon w;//스크립트
    public GameObject Weapons_0;//무기 오브젝트
    SpriteRenderer rend;
    Rigidbody2D rigid;
    public float maxShotDelay;//최대속도
    public float curShotDelay;//발사간 속도

    public GameObject bulletObj; 

    // Start is called before the first frame update
    void Start()
    {
        w = Weapons_0.GetComponent<Weapon>();//스크립트 불러옴
        rigid = gameObject.GetComponent<Rigidbody2D>();
        rend = GetComponent<SpriteRenderer>();
    }
    // Update is called once per fdbslxl rame , 1분에 약60번 업데이트
    void Update()
    {
        Move();//이동하는 함수
        Fire();//총알을 쏘는 함수
        Reload();//장전한하는 함수
 
    }
    void Move()
    {
        rigid.velocity = new Vector2(0, 0);
        if (Input.GetKey(KeyCode.LeftArrow))//왼쪽 방향키 누르면
        {
            w.yFlip();
            rend.flipX = true;
            Weapons_0.transform.localPosition = new Vector3(-0.66f, 0.38f, 0);
            rigid.velocity = new Vector2(-10f, 0);

        }
        if (Input.GetKey(KeyCode.RightArrow))//오른쪽 방향키 누르면
        {
            w.nFlip();
            Weapons_0.transform.localPosition = new Vector3(0.66f, 0.38f, 0);
            rend.flipX = false;
            rigid.velocity = new Vector2(10f, 0);

        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            rigid.AddForce(new Vector2(0, 50f));
        }
    }
    void Reload()
    {
        curShotDelay += Time.deltaTime;
    }
    void Fire()//발사하는 함수
    {
        if(!Input.GetButton("Fire1"))//Fire버튼을 안누르면 종료
        {
            return;
        }
        if(curShotDelay<maxShotDelay)//장전시간이 충족이안되면
        {
            return;
        }
        GameObject bullet = Instantiate(bulletObj, transform.position, transform.rotation);
        Rigidbody2D rigid_bullet = bullet.GetComponent<Rigidbody2D>();
        rigid.AddForce(Vector2.right*10,ForceMode2D.Impulse);

        curShotDelay = 0;//꼭 초기화해줘야된다.
    }
}

Weapon.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Weapon : MonoBehaviour
{
    SpriteRenderer rend;
    private void Start()
    {
        rend = GetComponent<SpriteRenderer>();
    }
    public void yFlip()
    {
        rend.flipX = true;
    }

    public void nFlip()
    {
        rend.flipX = false;
    }

}

이번 포스팅에서 제일 중요하게 여길 개념은 바로 프리펩이다.

프리펩이란?  재활용을 위해 에셋으로 저장된 게임 오브젝트

즉 총알은 프리펩으로 구현을 해줘야 한다. 아래 사진과 같이 프리펩폴더에 총알을 넣어준다.

만약 Player.cs를 위와 같이 구현했다면 아래 사진에 동그라미 친 곳과 같이 BulletObj를 선택할 수 있는데 거기에 만들어논 Bullet프리펩을 넣어준다.

아래는 시현 영상이다.

의도한대로 총알이 제한속도에 맞춰서 나가기는 한다. 그런데 아래에서 생성이된다..... 그리고 또한 총알을 계속 쓰다보면 무한히 생성되서 과부하가 걸리는데 일정영역을 벗어나면 파괴데게 bullet.cs 스크립트를 새로 작성해줘야 할 필요성이 느껴진다.

다음 포스팅에서는

  • 총알 발사 똑바로 되게 수정
  • 일정영역을 벗어나면 총알이 없어지게(파괴되게) 수정

위 2가지를 포스팅해 볼까 한다.

 

댓글과 지적은 언제든지 환영입니다~!

donaricano-btn글이 마음에 들었다면 왼쪽이미지를 눌러서 후원 부탁드립니다><

반응형