1. 구현방법 생각하기
1) 총알 만들기(Bullet)
이동, 충돌 처리, 이펙트 재생
2) 총알 나오는 곳(Bullet Shooter)
회전, 총알생성
2. 구현
1) 총알 만들기(Bullet)
마음에 드는 Sprite를 가져다가 만듬 (나는 y축+ 쪽이 머리인 스프라이트를 선택함)
총알은 앞으로 나가야 하기 때문에 rigidbody2D 설정 + Kinematic 설정
-> Script에서 velocity 설정할 것
총알은 Collider를 만나면 처리해야 함으로 Collider 추가 + Trigger 설정
-> OnTriggerEnter2D 사용 할 것
우선 앞으로 이동하기만 하면됨, 코드는 아래와 같음
-> 앞으로만 이동해야 하는데 자기 회전값에 대한 앞임, 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(0, 0, 360 * 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(0, 0, 360 * 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 |