본문 바로가기
대외 활동/유니티 스터디

[unity] class5_3D게임_제작과정2(collider, particle, ray)

by ballbig 2021. 8. 6.
728x90

제작과정 1을 보고싶다면!

https://bigballdiary.tistory.com/30

 

[unity] class5_3D게임_제작과정1(지형설정, paint)

1. Lighting설정하기 Directional Light만으로는 어둡기 때문에 Lighting을 추가해 주어야 한다. (*이때, Auto Generate 체크는 해제한다.) 2. 지형배치하기_Terrain 1) 지형 생성하기 3D object -> Terrain을..

bigballdiary.tistory.com

 

 

 

 

 

1. 과녁에 collider적용하기

과녁 설치 모습

 

과녁 object선택 후 AddComponent에서 과녁에 Box Collider 적용한다.

 

 

 

2. 밤송이에 Rigidbody컴포넌트와 collider을 적용한다.

밤송이에 Rigidbody컴포넌트와 collider을 추가한다.

 

 

3. 밤송이를 날리기 위한 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BamController : MonoBehaviour
{
    public void Shoot(Vector3 dir) //인자로 3차원 벡터가 입력되고
    {
        GetComponent<Rigidbody>().AddForce(dir); // 들어온 입력벡터 만큼 오브젝트에 힘이 가해진다.
    }
    // Start is called before the first frame update
    void Start()
    {
        Shoot(new Vector3(0, 200, 2000));

 

*과녁과 충돌 상태로 정지할 있도록 중력의 영향을 무시하도록 한다 : iskinematic = true

 

 

4. 밤송이에 particle 효과 적용
1) paricle 컴포넌트를 추가한다.

2) particle효과 알맞게 수정하기


- particle의 종류변경은 Renderer -> Material에서 할 수 있다.

 

 

- particle의 분사모양 변경은 Shape에서 할 수 있다.

 

 

- particle 생성패턴 조절은 Emission에서 할 수 있다.

- particle 지속시간, 반복재생 해제

 

 

- particle이 서서히 사라지도록 만들기 : size over life time

 

 

[particle size 곡선이 1번과 같이 직선인 경우]

 

[particle size 곡선이 2번과 같이 곡선인 경우]

 

 

5. particle 스크립트 작성 : 생성시기 설정

 public void OnCollisionEnter(Collision collision) //다른 물체와 충돌하는 순간
    {
        GetComponent<Rigidbody>().isKinematic = true; //중력의 영향을 무시
        GetComponent<ParticleSystem>().Play(); // particle효과를 실행시킨다.
        }

과녁과 충돌하는 순간 particle을 재생시키기 위해 위와 같은 코드를 추가한다.

 

 

 

6. 밤송이 Generator 스크립트 작성 : 밤을 날린 후 다시 밤송이가 생성되도록

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BamGenerator : MonoBehaviour
{
    public GameObject bamPrefab;

    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) //마우스버튼을 누르는 경우
        {
            GameObject bam = Instantiate(bamPrefab) as GameObject; //밤 오브젝트를 생성하고
            }
}

밤을 날린 후 다시 밤송이가 생성되도록 위와 같이 스크립트를 작성해준다.

 

 

prefab으로 밤 오브젝트를 넘겨준다.

 

 

 

7. 밤송이 날리는 방향설정 : ScreenPointToRay 메서드 이용

월드 좌표계 (3차원) 스크린 좌표계(2차원) 전혀 다른 척도이다.

따라서 마우스 클릭하는 방향(2차원 좌표계)으로 밤송이(3차원 좌표계)를 날리기 위해선 좌표설정을 수정해주어야 한다.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BamGenerator : MonoBehaviour
{
    public GameObject bamPrefab;

    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) //마우스버튼을 누르는 경우
        {
            GameObject bam = Instantiate(bamPrefab) as GameObject; //밤 오브젝트를 생성하고

            //마우스가 탭한 위치를 스크린 좌표계로 변환시켜준다. 
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //인자로 들어온 좌표로 향하는 광선(Ray) 클래스를 반환한다.
            Vector3 worldDir = ray.direction; //
            bam.GetComponent<BamController>().Shoot(worldDir.normalized*2000); //BamController스크립트에서 작성한 Shoot함수를 호출시킨다.
        }
    }
}
  • 광원 좌표 = Main Camera 좌표
  • 벡터.normalized : 길이가 1 단위 벡터로 바꿔준다.
  • 광원 방향 = 화면을 누른 좌표 지점으로 향하는 방향