언어/유니티

5- 과녁 맞추기 (3D)

깡 딱 2023. 2. 16. 13:56
728x90

오늘 처음 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

 

 

 

728x90