Unity-예제-AppleBasket(GameScene)
-클릭하는 곳으로 바구니 이동
https://docs.unity3d.com/kr/current/Manual/UsingPrecomputedLighting.html
-stage 오브젝트는 boxcollider를 넣어주었다.
(item이 생성되고 stage(바닥)에 부딪히면 삭제되어야 하기 때문이다.)
->ItemController에서 게임 오브젝트의 y값을 이용해 구현하였다.
-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);
}
}
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 |