-
3D(Terrian, 파티클, Ray 클래스)유니티/유니티 메인 2024. 2. 5. 10:56
<Terrain>
Terrian = 산이나 강 등 지형을 간단히 색을 칠하듯 만들수 있는 기능.
지형과 마찬가지로 잔디나 모래, 3D 나무나 풀도 색을 칠하듯 심을수 있다
Hierarchy 창에서 3D Object - Terrian 선택해서 추가. 그럼 커다란 판 하나가 생성된다
Terrian은 일종의 큰 그림판 같은 느낌이다. 이 판 안에서는 마음대로 변형하고, 재질을 입혀 지면을 만들수 있다
Ctrl + Shift + F = 현재 보고 있는 위치로 카메라 위치를 가져오는 단축키(카메라 선택후 눌러야 함)
Terrian을 선택후 Inspector창에서 두번째 Paint Terrian을 선택후 Raise or Lower Terrian을 선택
그럼 Scene창에서 마우스를 갖다댄 위치에 조금 무언가 올라온게 보인다
Inspector창에서 브러쉬의 세부조절이 가능하고, 드래그로 지형을 만들수 있다
미리 다운 받아둔 텍스쳐 에셋을 Terrian에 적용시켜보겠다
Terrian의 Inspector 창에서 Edit Terrian Layers를 클릭한뒤 Create Layer 선택
원하는 텍스쳐를 고른뒤 더블클릭해준다
New Layer라는 이름으로 등록이 되며 모든 Terrian이 선택한 텍스쳐로 적용된다
두번째 레이어도 등록한뒤 산 윗부분을 바위 질감으로 칠해준다
뒷배경으로 산이 잘 보이도록 카메라를 옮겨준다
타겟 오브젝트를 넣어준뒤 충돌판정을 위해 box collider 추가
밤송이 오브젝트를 추가한뒤 Sphere Collider와 중력도 받아야하기 때문에 Rigidbody도 추가한다
이제 BamsingControl 스크립트를 만들어준뒤 AddForce를 이용하여 밤송이를 날릴 코드를 작성한다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BansongControl : MonoBehaviour { void shoot(Vector3 dir) { GetComponent<Rigidbody>().AddForce(dir); } void Update() { shoot(new Vector3(200, 20, 0)); } }
shoot이라는 메서드를 따로 만들어 매개변수로 Vector3 형식의 변수 dir을 입력받는다
그리고 그 밑줄에 바로 컴포넌트를 불러온다
y축에도 힘을 주는 이유는 중력으로 인해 바닥으로 떨어지는것을 막기 위함이다.
스크립트는 당연히 밤송이에 삽입
이번엔 과녁에 부딫히는 순간 밤송이가 그대로 달라붙는 스크립트를 작성한다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BansongControl : MonoBehaviour { void shoot(Vector3 dir) { GetComponent<Rigidbody>().AddForce(dir); } // 메서드 추가 private void OnCollisionEnter(Collision collision) { GetComponent<Rigidbody>().isKinematic = true; } void Update() { shoot(new Vector3(200, 20, 0)); } }
충돌을 감지할 수 있는 OnCollisionEnter 메서드를 추가한다
닿는순간 밤송이가 멈추므로 isKinematic을 true로 설정하면 오브젝트의 힘을 무시하고 정지시킬수 있다
<파티클>
파티클 : 입자. 입자를 대량으로 표시해 각 입자의 움직임, 색, 크기를 제어함으로써 물, 연기, 불등 표현가능
이제 파티클을 추가해보자
1. 당연히 밤송이에서 이펙트가 나올 예정이니 밤송이를 선택하고
컴포넌트 추가 - Effects - Particle System 클릭
그럼 이펙트로 분홍 색종이들이 날린다. 이건 파티클에 머트리얼을 설정하지 않은 상태이다
2. Particle System 매개변수 중 Material에서 적절한 이펙트를 골라 눈송이가 날리게 한다
이번엔 Particle System 매개변수를 조절해 확 퍼지는 이펙트를 생성하겠다
Shape : 이펙트가 퍼지는 모양
Radius : 퍼지는 반경
Duration : 파티클 방출시간
Start Lifetime : 파티클 표시 시간
이제 좀 더 파티클이 부드럽게 사라지도록 만들어보자
Size over Lifetime 선택후 Size에 들어가 곡선을 위의 그림처럼 만들어 파티클이 부드럽게 천천히 사라지도록 한다
반복할 일 없으니 Looping 선택해제, 과녁에 닿았을때만 이펙트를 발생시킬 예정이니 Play on Awake를 모두 선택해제 해준다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BansongControl : MonoBehaviour { void shoot(Vector3 dir) { GetComponent<Rigidbody>().AddForce(dir); } private void OnCollisionEnter(Collision collision) { GetComponent<Rigidbody>().isKinematic = true; // 파티클 시스템 컴포넌트 재생 GetComponent<ParticleSystem>().Play(); } void Update() { shoot(new Vector3(200, 20, 0)); } }
3. 이제 충돌을 감지하고 파티클을 재생해야 하기에 BamsongControl의 충돌판정 매서드에 파티클 컴포넌트를 찾아 넣어준다
그럼 부딫히는 순간 파티클이 재생되는것을 확인할 수 있다.
이제 밤송이 프리팹을 만들고 화면을 클릭하는대로, 클릭한 지점에서 밤송이가 날아가게 해보자
우선 프리팹을 만들어준뒤 이름을 변경해준다
늘 그랬듯이 프리팹 생성은 Generator 스크립트를 따로 만들어준뒤 프리팹을 생성하는 코드를 작성한다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BamsongiGenerator : MonoBehaviour { public GameObject bamsongiPrefab; void Update() { if (Input.GetMouseButtonDown(0)) { GameObject bamsongi = Instantiate(bamsongiPrefab); bamsongi.GetComponent<BamsongiController>().Shoot(new Vector3(200, 20, 0)); } } }
앞으로는 Generator에서 밤송이를 생성함과 동시에 발사방향까지 결정하기에
Bamsongicontrol에 있는 Shoot 메서드를 주석처리한다
BamsongiGenerator를 만든뒤 스크립트를 넣어준다. Inspector창에서 프리팹 넣어주는것도 잊지 않는다
가장 마지막 단계로, 가장 중요한 단계이기도 하다.
이제 클릭을 하는대로 클릭한 마우스 위치에서 밤송이가 나가게 하는 스크립트를 짜준다
지금까지는 정해진 방향으로 밤송이를 날려왔지만, 이번엔 탭한곳으로 밤송이가 날아가게 해야한다
그러기엔 우선 탭한 좌표를 알아야한다.
물론 Input.MousePosition 메서드로 구할수 있지만 3D에서는 그 값을 그대로 쓸수 없다
mousePosition 값이 월드 좌표계 값이 아닌 스크린 좌표계 값이기 때문이다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BamsongiGenerator : MonoBehaviour { public GameObject bamsongiPrefab; void Update() { if (Input.GetMouseButtonDown(0)) { GameObject bamsongi = Instantiate(bamsongiPrefab); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Vector3 worldDir = ray.direction; bamsongi.GetComponent<BamsongiController>().Shoot(worldDir.normalized * 2000); } } }
여기서 중요한건 Ray 클래스이다
1. Ray는 ScreenPointToRay라는 메서드를 가지고 있는데
이는 카메라에서 탭 좌표로 향하는 벡터에 따른 광선 클래스를 반환하는 메서드이다. 여기서 탭한 위치는 (MousePosition)
2. worldDir라는 Vector3식 변수를 선언한뒤 카메라에서 탭한 좌표의 위치인 벡터를 받는 ray.direction을 값으로 준다
3. 그리고 밤송이를 발사하는 Shoot메서드를 불러와 worldDir.normalized 방향으로 2000의 힘만큼 발사한다
(normalized : 길이를 1인 백터로 만들어줌)
'유니티 > 유니티 메인' 카테고리의 다른 글
json 응용 (0) 2024.02.14 레벨 디자인, Debug.DrawRay, RayCast, RayCastHit (0) 2024.02.07 물리엔진, 애니메이션, 씬변환 (2) 2024.02.05 프리팹, 충돌판정 (2) 2024.02.04 Vector와 transform 응용, UI 표시, 효과음 삽입 (0) 2024.02.03