본문 바로가기
KDT/유니티 기초

23/08/06 유니티 기초 복습(CatEscape, Bamsongi)

by 잰쟁 2023. 8. 6.
728x90

2. Bamsongi

 

1) 밤송이 던져서 과녁(타겟)에 맞춰서 붙게하기

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

public class BamsongiController : MonoBehaviour
{
    public Rigidbody rBody;
    [SerializeField]
    private float forwardForce = 2000;

    private void Awake()
    {
        this.rBody = this.GetComponent<Rigidbody>();
    }
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Start");
        this.Shoot();
    }
    public void Shoot()
    {
        Debug.Log("Shoot");
        //앞으로 힘을 줘서 이동시킴
        //앞 : (0,0,1)
        //Vector3.forward : 월드좌표
        //밤송이가 바라보는 앞쪽 : 로컬좌표
        this.rBody.AddForce(0,200,this.forwardForce); //200: 밤송이 지면낙하 방지
    }

    public void OnCollisionEnter(Collision collision)
    {
        //충돌한 대상의 게임오브젝트 이름

        if(collision.gameObject.tag == "Target")
        {
            Debug.Log("과녁에 충돌!");
            this.rBody.isKinematic = true;  //과녁에 붙이기
        }
    }
}

 

2) 파티클 재생 및 밤송이 공장 만들기

 

BamsongiController

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

public class BamsongiController : MonoBehaviour
{
    public Rigidbody rBody;
    [SerializeField]
    private float forwardForce = 2000;
    private ParticleSystem effect;

    private void Awake()
    {
        this.rBody = this.GetComponent<Rigidbody>();
        this.effect = this.GetComponent<ParticleSystem>();
        Debug.Log("Awake");
    }
    
    void Start()
    {
        Debug.Log("Start");
        //this.Shoot();
    }
    public void Shoot(Vector3 force)
    {
        Debug.Log("Shoot");
        //앞으로 힘을 줘서 이동시킴
        //앞 : (0,0,1)
        //Vector3.forward : 월드좌표
        //밤송이가 바라보는 앞쪽 : 로컬좌표
        this.rBody.AddForce(force); //200: 밤송이 지면낙하 방지
    }

    public void OnCollisionEnter(Collision collision)
    {
        //충돌한 대상의 게임오브젝트 이름

        if(collision.gameObject.tag == "Target")
        {
            Debug.Log("과녁에 충돌!");
            this.rBody.isKinematic = true;  //과녁에 붙이기
            this.effect.Play();  //파티클 효과 실행
        }
    }
}

BamsongiGenerator

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

public class BamsongiGenerator : MonoBehaviour
{

    //밤송이 프리팹
    public GameObject bamsongiPrefab;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {       
        if (Input.GetMouseButtonDown(0))
        {
            //마우스를 클릭하면 월드공간에서 Ray를 생성
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //생성된 레이를 에디터에서 출력
            Debug.DrawRay(ray.origin, ray.direction * 1000f, Color.red, 1f);
            //ray.direction.normalized (단위 벡터로 변경)
            //길이가 1인 벡터 : 방향
            Vector3 force = ray.direction.normalized * 2000f;
            this.CreateBamsongi(force);
        }   
    }

    //마우스 클릭하여 새로운 밤송이 생성
    public void CreateBamsongi(Vector3 force)
    {
        //게임오브젝트 복제(생성)
        GameObject go = Instantiate(this.bamsongiPrefab);
        BamsongiController controller = go.GetComponent<BamsongiController>();
        controller.Shoot(force);  //밤송이 생성후 밤송이 던지기      
    }
}