* unitypackage 파일들이 안불러져서
헤멨는데 파일이 있는 폴더까지의 경로 중 한글 폴더가 있으면 발생하는 문제였다.
* 게임 오브젝트를 선택한 뒤 'v'키를 클릭하면 각 모서리에서 모서리로 스냅핑이
가능해 간단하고 정확히 붙일 수 있다.
* Player 모델의 전후좌우 이동, 마우스 좌우 이동에 따른 회전 처리, 카메라가 Player 모델 따라가기
처리.
* Project-Models-AngryBotPlayer-Player 모델 선택하고 Inspector-Animation에서
Clips + 버튼 누르고 idle(0-74), runForward(76-94), runBackward(96-114),
runRight(116-134), runLeft(136-154)로 나누고 Wrap Mode: Loop로 설정한
뒤 Apply 눌러 애니메이션 파일 가르기.
Hierarchy-Player-PlayerModel의 Inspector-Animation에서 Animation에
Idle 적용, Hierarchy-Player의 Inspector-csPlayerCtrl(Script)에서 Anim
밑 각 애니메이션 항목에 Project에서 해당 애니메이션 클립 드래그하여 적용.
* 전후좌우 이동시 해당 애니메이션으로 변화하게 처리.
* 마우스 좌 클릭시 총알 생성, 발사 처리.
if (Input.GetMouseButtonDown (0)) { Fire(); }
Instantiate (bullet, firePos.position, firePos.rotation);
총알 프리팹: GetComponent<Rigidbody>().AddForce (transform.forward
* speed);
총알 프리팹에 Component-Effects-Trail Renderer 적용, Trail Renderer-Material에
BulletTrail 매터리얼(Shader: Particles/Additive) 적용, Time: 0.3, Start
Width: 0.2, End Width: 0.01로 설정하여 총알 뒤에 궤적이 남게 처리.
* Project창에서 우클릭 Import Package-ParticleSystems 클릭, 파티클 패키지 설치.
Standard Assets-ParticleSystems-Prefabs의 Flare.prefab 선택, Inspector-ParticleSystem-Open
Editor 눌러 Particle Effect 창 띄우기. Duration 속성들을 0.3으로, Looping은
off로 설정.
csWallCtrl.cs 스크립트 수정하여 총알이 벽에 부딪쳤을 때 불꽃 튀는 파티클 추가하게 처리.
* 드럼통 추가. Project-Models-Barrel-Barrel.fbx 선택, Inspector-Model
탭 Meshes-Scale Factor: 0.4로 변경하고 Apply.
Hierarchy에 추가한 뒤 Component-Physics-Rigidbody, Capsule Collider
적용. Capsule Collider-Center Y: 1.25, Radius: 0.8, Height: 2.5,
Direction: Y-Axis 적용.
드럼통에 총알 충돌시 부딪친 총알 제거, 드럼통 폭파 이펙트 추가, 반경 10 내 다른 물체에 폭발력 전달, 5초뒤
드럼통 제거 처리.
//지정한 원점 중심 10.0f 반경내에 들어 있는 Collider 객체 추출
Collider[] colls = Physics.OverlapSphere (tr.position,
10.0f);
foreach (Collider col in colls) {
Rigidbody rbody = col.GetComponent<Rigidbody>();
if(rbody != null){
rbody.mass = 1.0f;
//Rigidbody.AddExplosionForce(폭발력, 원점, 반경, 위로 솟구치는 힘);
rbody.AddExplosionForce(1000.0f, tr.position, 10.0f, 300.0f);
} }
이펙트들의 사용이 끝난 뒤에도 지워지지 않고 남아 있어 Hierarchy창이 끝없이 늘어나고 있다.
- 저자 홈에서 해결책을 발견. GameObject로 변형해 임시로 담은 뒤 그것을 제거하는 방법.
GameObject eff = (GameObject)Instantiate(sparkEffect,col.transform.position,
Quaternion.identity);
Destroy(eff, 1.0f); //1초뒤 효과 제거
드럼통에 무작위로 선택한 텍스처 입히기.
//무작위로 선택한 텍스처 배열
public Texture[] textures;
void Start(){
//드럼통에 무작위로 선택한 텍스처 입히기
int idx = Random.Range (0, textures.Length);
GetComponentInChildren<MeshRenderer>().material.mainTexture
= textures[idx]; }
* Random.Range(최소값,최대값)의 경우 인자가 float/int인가에 따라 범위가 달라진다.
Random.Range(1.0f, 10.0f); //1.0f~10.0f 사이 난수발생(max까지가 범위)
Random.Range(1, 10); //1~9 사이 난수발생(max-1 까지가 범위)
* 총알에 유지시간을 설정해 생성뒤 10초 지나면 제거되게 처리.
public float LifeTime = 10.0f; //총알 유지 시간
void Start () {
GetComponent<Rigidbody> ().AddForce (transform.forward *
speed); //총알 발사
Destroy (gameObject, LifeTime); //발사뒤 총알 유지시간
지나면 제거하기 }
* gun.wav project 창으로 불러들여 Force to Mono에 체크, Apply로 모노로 변환.
pfBullet 프리팹에 Component-Audio-Audio Source 컴포넌트 추가. Inspector-Audio
Source-AudioClip에 gun.wav 적용, Play On Awake 체크, Min Destance(볼륨
100%로 들리는 영역): 5, Max Distance(음원이 들리는 최대 영역): 10 적용.
프리팹에 오디오 소스를 적용하는 경우 벽 등 가까이서 발사하여 오디오가 다 울리기 전 게임오브젝트가 사라지는 경우
오디오가 끊긴다. 하여 Player에 Audio Source 컴포넌트를 추가하고 csFireCtrl.cs 스크립트를
수정하여 소리가 끊기지 않게 처리.
public AudioClip fireSfx; //총알 발사 사운드
private AudioSource source = null; //AudioSource 컴포넌트 저장용 변수
void Start(){
//AudioSource 컴포넌트 추출 뒤 변수에 할당
source = GetComponent<AudioSource> (); }
void Update () {
//마우스 좌클릭시 Fire 함수 호출
if (Input.GetMouseButtonDown (0)) { Fire(); }
}
void Fire(){
CreateBullet (); //동적으로 총알 발사 함수 호출
//사운드 발생 함수(음원 소스, 볼륨)
source.PlayOneShot (fireSfx, 0.9f);
}
* Player 총구 앞 화염효과: Hierarchy-Player-FirePos 하위에 Quad 추가, 'MuzzleFlash'로
이름 바꾸기, Mesh Collider 컴포넌트 제거. MuzzleFlash.png 불러들여 matMuzzleFlash.mat
생성한뒤 추가(shader: Particles/Additive). Quad에 매터리얼 적용. csFireCtrl.cs
스크립트를 수정하여 총알 발사시 총구 앞 화염이 보였다 안보였다 하게 처리.
//잠시 기다리는 루틴을 위해 코루틴 함수로 호출
StartCoroutine (this.ShowMuzzleFlash ());
//MuzzleFlash 활성/비활성을 짧은시간 동안 반복
IEnumerator ShowMuzzleFlash(){
//MuzzleFlash 스케일을 불규칙하게 변경
muzzleFlash.enabled = true;
//불규칙한 시간 동안 Delay한 다음 MeshRenderer 비활성화시키기
yield return new WaitForSeconds(Random.Range(0.05f, 0.3f));
muzzleFlash.enabled = false; }
|