5- 과녁 맞추기 (3D)
오늘 처음 3D 입문했는데
2D랑은 진짜 달라도 너무 달라서 조금 당황했지만
재미는 두 배였다 ㅋㅅㅋ
완성된 모습은 이러하다.
3d는 코드 짜기도 어렵지만
내가 볼 땐 코드보다 모델하는 게 훨씬 어려운 거 같다.
Terrain을 한 개 만들어준다.
3D object-> Terrain
center와 pivot 차이점을 알아 둬야겠다.
만들어주면 이런 게 보이는데
밑에 브러시 사이즈는 말 그대 로고 opacity는 불투명이란 뜻이다.
저런 식으로 두 번째 기능에
내려보면 산을 만들 수도 있고 홀을 만들 수도 있고 다양하게 있는데
직접 해보는 걸 추천한다.
Paint Texture -> Edit Terrain Layer -> Add rayer
재료를 넣어 색깔을 정해줄 수 있음
세 번째 기능을 누르면 나무도 만들 수 있는데 Edit Tree 눌러서 추가시키면 된다.
그리고 나무나 기능들이 없다고 찡찡 될 수도 있는데 에셋 스토어에 들어가서 나무, 색 관련된 무료 에셋 다운
받아주면 끝이 난다.
대충 깔면 웅장하게 나오니까 대충깔고
책에 나온 친구들을 다운로드하여주고
target 위치 0 0 10 + box 콜레이더 center 0 6.5 0 size 3.8 3.8 1 잡아주고
밤송이에 컴포넌트 중 파티클 시스템 넣어준다
https://docs.unity3d.com/kr/2020.3/Manual/class-ParticleSystem.html
참고 바람
그리고
빈 박스 만들어주고 이름 바꿔주고
BamsongiGenerator코드ㄱ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BamsongiGenerator : MonoBehaviour
{
public GameObject bamsongiPrefab; // prefabs 에 넣게 만들어줄 변수
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0)) //마우스를 눌린순간
{
GameObject bamsogi = Instantiate(bamsongiPrefab) as GameObject;
//밤송이
// 앞에서도 적었지만 한번 더 적겠다.
// Instantiate 복제하는것이다.
// as GameObject을 적는이유는 Instantiate는 object형을 반환
//하지만 GameObject형을 받기위해서 강제형 변환을 해야된다
//이럴때 이용하고 이것을 캐스트라고 부른다.
bamsogi.GetComponent<Bamsongicontroller>().Shoot(new Vector3(0, 200, 2000));
// 한마디로 밤송이 컨트롤러에있는Shoot 을 가져오는것
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 worldDir = ray.direction;
bamsogi.GetComponent<Bamsongicontroller>().Shoot(worldDir.normalized * 2000);
//알아 보는 중 수정필요
}
}
}
bomsongicontroller 밤송이에도
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bamsongicontroller : MonoBehaviour
{
public void Shoot(Vector3 dir)
{
GetComponent<Rigidbody>().AddForce(dir);
}// dir에 물리적인 힘을 받는다
void OnCollisionEnter(Collision other)//오브젝트간 충돌에서 벗어날때 한번 호출되는 함수.
{// 한마디로 밤송이가 날라가서 멈추면 파티클을 이르키고 강체가 true이됨
// 강체가 true이 되면 뭐가 바뀌나면 ex) 물체가 총알을 다튕겨 내버린다.
GetComponent<Rigidbody>().isKinematic= true;
GetComponent<ParticleSystem>().Play();
}
}
그러면 밤송이 잘 날아간다.
BamsongiGenerator 코드에서
Ray에 대한 설명 -
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 worldDir = ray.direction;
bamsogi.GetComponent<Bamsongicontroller>().Shoot(worldDir.normalized * 2000);
광선 =빛이 나아가는 길을 나타내는 기하학적인 선.
광원 =제 스스로 빛을 내는 물체. 태양, 별 따위가 있다. 참고.
https://docs.unity3d.com/ScriptReference/Camera.ScreenPointToRay.html
여기에 참고하면 좋을 거 같다.
먼저 ScreenPointToRay는
카메라에서 스크린 포인트를 통과하는 광선을 반환한다. 광선은 여기서 Ray이다.
Ray는 광원의 좌표(origin)와 방향(direction)을 멤버 변수로 가진다.
Ray는 콜라이더가 적용된 오브젝트와 충돌을 감지하는 특징이 있다.
광선이 오브젝트로 가려지면 그것을 감지할 수 있다.
ScreenPointToRay메서드의 반환으로 얻을 수 있는 Ray는 origin, direction메서드인데
origin이 Main카메라 좌표이고 direction이 카메라에서 탭할 좌표로 향하는 벡터이다.
카메라를 기준으로 direction방향으로 날라 가기 때문에
direction가 가진 normalized변수를 사용한다.
그래서 밤송이의 크기에 상관없이 일정한 힘으로 날려 보낼 수 있게 만든다.
https://docs.unity3d.com/kr/530/ScriptReference/Ray-direction.html