코드부터.. 총이라는건 마우스를 클릭했을때 발사되는게 일반적이므로
마우스 클릭 이벤트를 만들겠다.
getMouseDown()은 마우스가 눌렸을때, getMouseUp은 마우스를 뗄 때이다. 키보드도 마찬가지로 getKeyDown/up 있음.
총알을 만들기 위해 빈 게임 오브젝트를 하나 생성한다.
그리고 하이러키 패널의 캐릭터>MachinGun객체로 소속시킨다.
이 빈 오브젝트는 BulletManager로 이름을 붙이겠다.
여기에 방금 만든 스크립트를 드래그한다.
총 효과음도 여기에 드래그 한다. 드래그 할 게 총 2개다.
배경음악은 게임 시작하자마자 재생시켜도 상관없지만
이 경우에는 총을 쏠 때만 효과음을 재생시켜야 하므로 Play On awake를 해제한다.
이제 Rigidbody타입으로 지정한 public 변수에 객체를 집어넣는 즐거운 시간이 돌아왔다.
총알은 따로 애셋을 준비하지 않았으므로 새로운 오브젝트를 생성해서 변수에 먹여주자.
구형 오브젝트를 생성하자. 그 동그랗고 예쁜 녀석말이다.
까먹었을거라 생각하고 다시 일러주겠다. 게임오브젝트>그 외>Sphere를 누르자.
크기는 비비탄 사이즈(?)인 (0.1, 0.1, 0.1)로 맞췄다.
-------------------------------------------
이 비비탄 총알들에게 물리엔진을 적용시키고 싶다. 유니티3D 정말 대단하지 않은가?
Sphere를 선택한 상태에서 컴포넌트>피직스>리짓바디를 선택한다.
인스펙터 패널을 보면 무게, 항력, 회전 항력, 중력..등등의 속성이 있다(우왕ㅋ굳)
이제 프로젝트에 Bullet 프리팹을 생성하고, 프리팹에 Sphere객체를 드래그해주자.
그리고 프리팹을 만들었으면 항상 원래 있던 객체는 삭제해주자. sphere객체는 이제 쓸모가 없다....
(하지만 앞으로 사용할 카메라의 "태그"를 "메인카메라"로 맞춰줘야 한다.
그래야 Camera.mainCamera로 접근할 수 있다.)
...여기까지 하다보면 원래의 목적을 깜박 잊고 헤매이기 쉬운데
public 변수에 객체를 먹여줘야할 차례였다.
Rigidbody형 Bullet은 방금 해결했고, 이제 float형 BulletSpeed는 그냥 20이라고 해주자.
지금까지 순서가 좀 복잡할 수 있는데, 정리하자면
1.스크립트를 생성하여 리짓바디와 사운드를 받을 수 있게 한다.
2.머신건 객체 밑으로 총알을 만들기 위한 빈 오브젝트 객체를 생성한다.
3.빈 오브젝트 객체에 스크립트를 넣고 사운드와 스피드를 초기화 해준다.
4.유일하게 아직 초기화가 안된 리짓형 Bullet을 초기화하기 위해 Sphere를 생성해서 물리엔진을 적용한다.
5.Sphere객체를 프리팹으로 만들어서 아까 초기화를 못한 리짓바디형 Bullet을 초기화한다.
그런데 총알이 왠지 이상하다.
게임을 실행해보면 황당하게도 총알이 직선으로 가지를 못하고 처음에는 맥없이 땅으로 곤두박질 칠 것이다.
이건 중력 설정 때문인데 프로젝트 패널에서 Use Grabity를 켜느나 끄느냐에 따라
총알이 힘없이 틱틱 곤두박질 치기도 하고, 중력을 완전 무시한채 벽 사이 끼여서 무한 와리가리를 하기도 한다.
그나마 중력 설정이 없는 편이 좀 더 그럴싸한 총알처럼 보이는데.. 저런 무한 와리가리가 좀 문제이기는 하다.
그래서 총알이 벽에 부딪혔을때 폭발하여 사라지는 연출을 추가하도록 하자.
폭발 효과를 위해 파티클을 생성한다. 컴포넌트는 Ellipsoid Particle Emitter, Particle Animator, Particle Renderer를 넣는다.
입실로이드 설정에서 one shot를 설정하면 효과가 단발성으로 지정되므로 폭발 연출등에 효과적이다.
다음은 Paricle Renderer에서 엘리먼트를 fire효과로 해준다.
다 만들었으면 프리팹으로 설정한다. 앞으로 복붙할 일이 있다.
일반적으로 객체와 객체의 "충돌"을 알려주는 장치를 태그라고 부른다.
방금 만든 Bullet프리팹을 선택하고 상단에 Tagged를 클릭하면 7가지 태그 속성을 볼 수 있다.
그런데 이 7가지 태그 속성들도 현재 우리가 사용하려는 목적에 부합하지 않으므로 Add Tag를 통해 새로 만들도록 한다.
눌렀으면 아래로
다시 인스펙터 패널로 돌아와서 패널을 눌러보면 방금 추가한 Bullet태그가 보인다. 클릭클릭.
스크립트를 추가해서 충돌을 제어해보자.
using UnityEngine;
using System.Collections;
public class BulletScript : MonoBehaviour {
public GameObject OriginalSpark;
private GameObject CloneSpark;
private ParticleEmitter Emitter;//파티클 제어를 위한 이미터 객체
void Start () {
//파티클 객체 복사
CloneSpark=(GameObject)Instantiate(OriginalSpark, OriginalSpark.transform.position, OriginalSpark.rotation);
//파티클 방출 안하게
Emitter = CloneSpark.GetComponent<particleEmitter>();
Emitter.emit=false;
}
void Update () {}
void OnCollisionEnter(Collision collision){
if(collision.transform.tag=="Bullet") return;
//파티클 생성
CloneSpark.transform.position = transform.position;
Emitter.Emit();
//현재 게임 객체를 제거
Destroy(transform.gameObject);
}
}
여기서 getComponent<>()를 다시 눈여겨 보면 <>안에 추출하고자 하는 컴포넌트를 의미하기도 하면서
<>안의 자료형을 리턴한다는 의미도 가지고 있다. 그냥 일단 억지로 이해하지는 말고 그렇구나 하고 넘어가자.
추출 실패시 null값을 리턴한다.
여기선 우리가 즐껴 쓰던 OnGUI대신 OnCollisionEnter()메소드를 생성했는데
Rigidbody형 컴포넌트와 Collider형 컴포넌트가 충돌할 경우 자동으로 실행되는 메소드이다.
참고로 유용한 팁을 말하자면 transform.gameObject와 그냥 gameObject는 같다.
gameObject는 상속된 놈이므로 굳이 transform을 통해 접근할 필요는 없다.
Destroy()는 객체를 죽이는 역할을 한다.
이 스크립트는 Bullet프리팹을 열어서 public변수에는 BulletSpark를 넣어줘야 한다.
...이 스크립트를 가지고 실험하다보니 재밌는 현상을 발견했다.
이제 총알은 벽이나 장애물에 부딪히면 파티클 효과를 내면서 소멸할 것이다.
총을 쏴도 벽을 뚫고 간다면 라디우스값을 크게 주면 된다.
파티클 지속 시간은 이미터의 min energy, max energy로 조절 가능하다.
'Unity3D' 카테고리의 다른 글
적 패트롤 행동넣기 (0) | 2013.07.03 |
---|---|
총알이 충돌되는 객체로 점수 올리기 (0) | 2013.07.02 |
화면 인터페이스 + 배경음악 (0) | 2013.07.01 |
게임 배경 및 캐릭터 생성하기 (0) | 2013.07.01 |
랜덤 "꽝"넣기와 게임오버 화면 (0) | 2013.06.30 |