본문 바로가기

Unity

Unity - 총알 구현하기(Bullet)

1. 구현방법 생각하기

1) 총알 만들기(Bullet)

이동, 충돌 처리, 이펙트 재생

 

2) 총알 나오는 곳(Bullet Shooter)

회전, 총알생성

 

 

 

 

 

2. 구현

1) 총알 만들기(Bullet)

 

마음에 드는 Sprite를 가져다가 만듬 (나는 y축+ 쪽이 머리인 스프라이트를 선택함)

 

총알은 앞으로 나가야 하기 때문에 rigidbody2D 설정 + Kinematic 설정

 -> Script에서 velocity 설정할 것

 

총알은 Collider를 만나면 처리해야 함으로 Collider 추가 + Trigger 설정

 -> OnTriggerEnter2D 사용 할 것

Bullet Component

우선 앞으로 이동하기만 하면됨,  코드는 아래와 같음

-> 앞으로만 이동해야 하는데 자기 회전값에 대한 앞임, transform.up 신경써야 함

1
2
3
4
5
6
7
8
9
10
private Rigidbody2D rigid;
private void Start()
{
    rigid = GetComponent<Rigidbody2D>();
    Destroy(gameObject, lifeTime);
}
private void Update()
{
    rigid.velocity = transform.up * speed;
}
cs

 

 

 

또한 충돌처리 해줘야 함

파티클(or음악) 재생 + 데미지관련함수 + 총알꺼주기

코드는 아래와 같음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public ParticleSystem explosionParticle;
private void OnTriggerEnter2D(Collider2D other)
{
   if (other.tag == "Enemy")
   {
       //Play Particle
       ParticleSystem instance = Instantiate(explosionParticle, transform.position, Quaternion.identity);
       instance.Play();
       Destroy(instance.gameObject, instance.main.duration);
 
       //Take Damage
       //따로 구현필요
 
       //Set Active off
       Destroy(gameObject);
   }
}
cs

 

particle은 직접 만들거나 asset store에서 무료받아 사용하면 됨, 여기서는 Bullet의 Audio는 구현하지 않음

particle직접 만들어보는 것도 나쁘지 않음, 추후에 업로드 하겠음

 

위의 코드에서 Destory는 좋은 코드가 되지 못함

-> 생성 후 파괴를 계속하여 오버헤드 생김

-> 원래는 Objectpool에서 가져오는 것이 맞음 (여기서는 살펴보지 않음)

 

 

이러한 Bullet을 Prefab으로 만들어 둠

 

 

앞으로 가는 총알

cf) Enemy도 Rigidbody + Collider Trigger

 

 

 

 

2) 총알 나오는 곳(Bullet Shooter)

플레이어가 회전 중인 상태에 적절한 타이밍을 맞춰 상대를 맞추는 것을 구현하려 함

-> 마우스를 클릭하면 총알이 Bullet Shooter에서 나옴

 

플레이어가 회전 중일 때 Shooter도 회전해야 하므로 자식으로 설정

 

player에 스크립트 추가하여 초당 z축 회전을 시켜줌

-> 그럼 Bullet Shooter도 회전할 것

1
2
3
4
void Update()//script in player
    {
        transform.Rotate(00360 * Time.deltaTime);
    }
cs

 

Bullet Shooter에서는 위에서 만든 Bullet을 public으로 가져와 사용

마우스를 누르면 총알을 생성함

-> 원래 Objectpool을 이용해서 가져오는게 효율적임, 여기서는 편의상

 

 

코드는 아래와 같음

1
2
3
4
5
6
7
8
public GameObject bullet;
    void Update() //script in bulletshooter
    {
        if (Input.GetMouseButtonDown(0))
        {
            Instantiate(bullet, transform.position, transform.rotation);
        }
    }
cs

 

 

 

 

 

3. 결과

 

 

 

 

4. 전체코드

 

Bullet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Bullet : MonoBehaviour
{
    public ParticleSystem explosionParticle;
    public float speed = 5.0f;
    public float lifeTime = 10.0f;
 
    private Rigidbody2D rigid;
 
 
    private void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
        Destroy(gameObject, lifeTime);
    }
    private void Update()
    {
        rigid.velocity = transform.up * speed;
    }
 
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Enemy")
        {
            //Play Particle
            ParticleSystem instance = Instantiate(explosionParticle, transform.position, Quaternion.identity);
            instance.Play();
            Destroy(instance.gameObject, instance.main.duration);
 
            //Take Damage
 
            //Set Active off
            Destroy(gameObject);
        }
    }
}
 
cs

 

 

BulletShooter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class BulletShooter : MonoBehaviour
{
    public GameObject bullet;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Instantiate(bullet, transform.position, transform.rotation);
        }
    }
}
 
cs

 

 

Player

1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour
{
    void Update()
    {
        transform.Rotate(00360 * Time.deltaTime);
    }
}
 
cs

 

 

 

 

 

=== 참고 ===

 

Bullet이 앞으로만 간다고 해서 Vector3.up 쓰면 안됌

 

자신의 회전에 따른 앞(local.up)이므로 transform.up 씀에 명심

 

1. Vector3.up -> global 

2. transform.up -> local

 

 

 

 

'Unity' 카테고리의 다른 글

Unity - 블랙홀(Point Effector 2D)  (1) 2020.02.20
Unity - 인디케이터(Indicator)구현  (0) 2020.02.19
Unity - 스폰(Spawn) 구현하기  (0) 2020.02.17
Unity - 조이스틱(Joystick)  (0) 2020.02.15
Unity - 무한 배경(Loop Background)  (2) 2020.02.12