Unity-예제-AppleBasket(GameScene)
2023. 8. 7.

-클릭하는 곳으로 바구니 이동

 

main camera 설정

https://docs.unity3d.com/kr/current/Manual/UsingPrecomputedLighting.html

조명 설정

 

조명 데이터 생성 - Unity 매뉴얼

Unity에서 미리 계산된 조명은 배경에서 자동 프로세스로 생성되거나 수동으로 초기화될 때 생성됩니다. 이러한 프로세스가 실행되는 동안 에디터에서 작업을 계속할 수 있습니다.

docs.unity3d.com

Light 설정변경
stage 오브젝트

-stage 오브젝트는 boxcollider를 넣어주었다.

(item이 생성되고 stage(바닥)에 부딪히면 삭제되어야 하기 때문이다.)

->ItemController에서 게임 오브젝트의 y값을 이용해 구현하였다.

ItemController.cs의 y축이 0보다 작아지면 제거하는 코드
txtTime,txtScore
GameDriector에 txtTime과 txtScore가 할당되었다.
GameMain 오브젝트

-GameMain이라는 빈 오브젝트를 생성하고 transform을 리셋한 후, GameMain 스크립트와 ItemGenerator스크립트를 추가하였다.

-GameMain 스크립트를 통해 이전 씬(로비 씬)에서 선택한 basket에 따라 프리팹을 생성한다.

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

public class GameMain : MonoBehaviour
{
    public GameObject applePrefab;
    public GameObject basketGo;
    public GameObject basket1Prefab;
    public GameObject basket2Prefab;
    public GameObject basket3Prefab;
    int selectedBasketType;

    private BasketController basketController;
    // Start is called before the first frame update
    void Start()
    {
      
        this.selectedBasketType = InfoManager.instance.IntselectedBasketType;
        Debug.LogFormat("<color=green>InfoManager.instance.selectedBasketType: {0}</color>", this.selectedBasketType);
       
        
        if (this.selectedBasketType == 0)
        {//basket 생성
            basketGo = Instantiate(this.basket1Prefab);
            this.basketGo.transform.position = new Vector3(0, 0, 0);
            this.basketController = basketGo.GetComponent<BasketController>();
           
        }
        else if (this.selectedBasketType == 1)
        {//basket 생성
             basketGo = Instantiate(this.basket2Prefab);
            this.basketGo.transform.position = new Vector3(0, 0, 0);
            this.basketController = basketGo.GetComponent<BasketController>();
        }
        else
        {//basket 생성
           basketGo = Instantiate(this.basket3Prefab);
            this.basketGo.transform.position = new Vector3(0, 0, 0);
            this.basketController = basketGo.GetComponent<BasketController>();
        }
    }

    // Update is called once per frame
    void Update()
    {
        
       

    }
}

-아이템 제너레이터 클래스는 아이템의 생성에 관여한다.

 

-랜덤한 위치에 아이템을 생성하고 생성된 아이템은 아이템 프리팹에 있는 itemcontroller를 통해 하강한다.

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

public class ItemGenerator : MonoBehaviour
{
    private float elasedTime;//경과 시간
    private float spawnTime = 1f;
    public GameObject applePrefab;
    public GameObject bombPrefab;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //시간 재기
        //변수에 Time.deltaTime 더해라
        this.elasedTime += Time.deltaTime;
        if(this.elasedTime >= this.spawnTime)
        {
            this.CreateItem();//아이템 생성
            //생성 후 초기화
            this.elasedTime = 0f;
        }
    }

    private void CreateItem()
    {
        int rand = Random.Range(1, 11);//1~10
        GameObject itemGo = null;
        if(rand > 2)
        {
            itemGo = Instantiate(this.applePrefab);//사과
          
        }

        else
        {
            //폭탄
            itemGo = Instantiate(this.bombPrefab);
        }

        //위치 설정
        int x = Random.Range(-1, 2);
        int z = Random.Range(-1, 2);

        itemGo.transform.position = new Vector3(x, 3.5f, z);
        
    }
}

apple,bomb 프리팹에 있는 Item Controller.cs

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

public class ItemController : MonoBehaviour
{   
    private float moveSpeed = 0.05f;
    // Start is called before the first frame update
    void Start()
    {
     
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.Translate(Vector3.down*moveSpeed);
        if(this.transform.position.y < 0)
        {
            Destroy(this.gameObject);//바닥에 닿으면 아이템 제거
        }
        
    }

}

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

using UnityEngine;

public class BasketController : MonoBehaviour
{
    private AudioSource audioSource;
    
    public AudioClip appleSfx;
    public AudioClip bombSfx;
    [SerializeField]
    private GameDirector gameDirector;

    private void Awake()//Awake는 Start보다 먼저 실행된다.
    {
        GameObject gameDirectorGo = GameObject.Find("GameDirector");//GameDirector를 저장해준다.      
        this.gameDirector = gameDirectorGo.GetComponent<GameDirector>();
        Debug.LogFormat("Awake:{0}", gameDirectorGo);
        this.audioSource = this.GetComponent<AudioSource>();
    }
    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        //마우스 좌클릭시 화면을 클릭하면 Ray생성
        if (Input.GetMouseButtonDown(0))
        {
            //화면상의 좌표 -> Ray 객체를 생성
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            float maxDistance = 100f;
            Debug.DrawRay(ray.origin, ray.direction * maxDistance, Color.green, 2f);
            //ray와 collider의 충돌을 검사하는 메서드
            RaycastHit hit;//out 매개변수를 사용하기위해 변수정의를 해준다.
            if (Physics.Raycast(ray, out hit, maxDistance))//매개변수로 out넣어줌
            {//충돌하면
                //x좌표, z좌표를 반올림
                float x = Mathf.RoundToInt(hit.point.x);
                float z = Mathf.RoundToInt(hit.point.z);
                //새로운 좌표 생성
                this.transform.position = new Vector3(x, 0, z);
            }
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log(other.tag);

        if (other.transform.tag == "Apple")
        {
            Debug.Log("득점");
            this.audioSource.PlayOneShot(this.appleSfx);
            this.gameDirector.IncreaseScore(100);
            
        }
        else
        {
            Debug.Log("감점");
            this.audioSource.PlayOneShot(this.bombSfx);
            this.gameDirector.DecreaseScore(50);
            
        }

        this.gameDirector.UpdateScoreUI();

        Destroy(other.transform.gameObject);  //사과또는 폭탄을 제거 
    }

}

-바스켓 컨트롤러는 말그대로 basket의 제어를 담당한다.

-ray를 이용해 선택한 위치로 이동하게 하고, collider를 통해 득점, 감점을 적용한다.

 

'유니티 기초' 카테고리의 다른 글

Unity-코루틴으로 이동하기  (0) 2023.08.10
Unity- AppleBasket - LobbyScene  (0) 2023.08.07
Unity- 버튼 클릭(Onclick)하면 이동  (0) 2023.08.04
unity - 3d 기본 예제-밤송이  (0) 2023.08.04
Hero Jump 예제  (0) 2023.08.03
myoskin