일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 유니티 독학
- 크래프톤 게임 정글 랩
- ETRI 연구연수
- 크래프톤 정글 게임랩
- unity 게임
- 크래프톤 정글 게임 랩
- unity 설치
- 오픽 im1
- 게임 개발
- 게임 개발 독학
- Unity Chess
- 유니티 미연시
- unity 게임 개발
- 유니티
- 유니티 대화
- 유니티 스토리
- protobuf란
- 크래프톤
- unity 개발
- Unity 독학
- 크래프톤 정글랩
- protobuf 란?
- node.js
- 게임 독학
- unity 공부
- 유니티 체스
- 오픽 im1 5일
- unity 강의
- unity
- 유니티 퀘스트
- Today
- Total
하참이의 아이디어노트
Unity 강의 8일차 (1) - UI 마우스 클릭 본문
본 강의는 다음 문서를 참고하여 제작하였습니다. 자세한 내용은 하단 링크를 참조하시거나 댓글로 질문 남겨주시면 성심성의껏 답변 드리겠습니다.
5.1강 - 마우스 클릭 - Unity Learn
개요: 이제 마지막 단원입니다. 먼저 새로운 프로젝트를 만들고 시작 파일을 임포트한 후 게임의 뷰를 2D로 전환합니다. 그런 다음 플레이어가 클릭할 수 있는 타겟 오브젝트의 목록을 만듭니다.
learn.unity.com
UI는 User Interface로 User, 즉 사용자와 직접적으로 접촉하며 다뤄지는 오브젝트를 얘기합니다.
게임에 캐릭터와 몬스터, 맵만 있어도 훌륭한 게임이지만 캐릭터의 체력을 보여주지 않게되거나, 남은 총알 수를 보여주지 않으면 게임이 매우 불편해 질 것입니다.
또한 전략게임의 경우 캐릭터를 이동하거나 카드를 장착시키는 등의 버튼이 없다면 이동조차 할 수 없게 되겠지요.
이번 게임은 UI를 사용하는 법을 배우면서 UI의 중요성도 알아갈 수 있는 예제입니다.
프루츠 닌자와 같이 땅에서 올라오는 오브젝트 중 좋은 오브젝트를 클릭하고, 나쁜 오브젝트는 피하는 게임을 제작해보도록 하겠습니다.
새 프로젝트를 생성합니다. 이름은 Prototype5로 생성합니다.
다음 링크에서 패키지를 다운받은 뒤 임포트 합니다.
Scenes 폴더의 Prototype 5를 열고, SampleScnene을 저장하지 않은 채로 삭제합니다.
또한 Layout은 2 by 3로 권장합니다.
좋습니다. 이제 씬 뷰에 있는 2D 버튼을 눌러 씬 뷰를 2D로 볼 수 있도록 합니다.
이제 좋은 오브젝트와 나쁜 오브젝트를 만들겠습니다.
Library > props 폴더에서 착한 오브젝트 3개와 나쁜 오브젝트 1개를 씬으로 드래그하고, 이름을 Good 1, Good 2, Good 3, Bad 1으로 변경합니다.
생성한 오브젝트에 Rigidbody와 Box Collider 컴포넌트를 각각 추가한 다음 Collider를 오브젝트 크기에 맞게 수정합니다.
Scripts 폴더를 생성한다음 Target.cs 스크립트를 생성합니다.
각 4개의 오브젝트에 Target 스크립트 컴포넌트를 추가합니다.
Prefabs 폴더를 생성한다음 각 오브젝트를 프리팹화 한 뒤, 씬에서 삭제합니다.
게임 시작시 랜덤 오브젝트를 땅에서 튀어나오도록 해야합니다.
우선 Target이 생성되면 튀어오르는 코드부터 작성해야겠습니다.
Target.cs 스크립트를 다음과 같이 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Target : MonoBehaviour
{
private Rigidbody targetRb;
void Start()
{
targetRb = GetComponent<Rigidbody>();
targetRb.AddForce(Vector3.up * Random.Range(12, 16), ForceMode.Impulse);
targetRb.AddTorque(Random.Range(-10, 10), Random.Range(-10, 10), Random.Range(-10, 10), ForceMode.Impulse);
transform.position = new Vector3(Random.Range(-4, 4), -6);
}
void Update()
{
}
}
타겟 프리팹의 Rigidbody 컴포넌트에 접근해 12 ~ 16 정도 뛰어오르게 합니다.
또한 x, y, z 방향의 랜덤으로 토크를 주어 튀어오르는 방향과 힘이 랜덤하게 설정 될 것 입니다.
움직일 방향과 힘이 설정되면 타겟이 생성될 위치의 X축을 랜덤하게 설정합니다. Y는 상수 -6 입니다.
기존에 배웠던 코드를 응용한 코드이니 어렵지 않습니다.
하지만 문제가 있습니다.
Random.Range()를 너무 자주 사용하고, 상수의 남용이 잦습니다. 이는 '하드코딩' 이지요.
코드를 다음과 같이 수정해보겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Target : MonoBehaviour
{
private Rigidbody targetRb;
private float minSpeed = 12;
private float maxSpeed = 16;
private float maxTorque = 10;
private float xRange = 4;
private float ySpawnPos = -6;
void Start()
{
targetRb = GetComponent<Rigidbody>();
targetRb.AddForce(RandomForce(), ForceMode.Impulse);
targetRb.AddTorque(RandomTorque(), RandomTorque(), RandomTorque(), ForceMode.Impulse);
transform.position = RandomSpawnPos();
}
Vector3 RandomForce()
{
return Vector3.up * Random.Range(minSpeed, maxSpeed);
}
float RandomTorque()
{
return Random.Range(-maxTorque, maxTorque);
}
Vector3 RandomSpawnPos()
{
return new Vector3(Random.Range(-xRange, xRange), ySpawnPos);
}
void Update()
{
}
}
코드가 길어졌지만, 같은 기능을 사용해야 할 경우나, 코드의 수정이 필요할 경우 더욱 깔끔하게 처리할 수 있을 것 입니다. (유지보수 성능이 향상되었습니다.)
다음은 GameManager로 게임을 관리해보도록 하겠습니다.
빈 게임오브젝트를 생성한 다음 GameManager로 이름을 변경합니다.
새 스크립트를 생성한 뒤 이름을 GameManager로 설정합니다. (재미있는 점은 이 경우 스크립트의 아이콘이 톱니바퀴로 바뀝니다.)
GameManager 스크립트를 GameManager 게임 오브젝트에 부착합니다.
GameManger 스크립트에 다음 변수를 선언해줍니다.
public List<GameObject> targets;
그리고 Unity Editor로 돌아온 뒤 인스펙터창에서 GameManger 컴포넌트의 각 Target들을 Target 프리팹으로 채웁니다.
이제 오브젝트 생성을 위한 코루틴을 작성해봅시다.
GameManager.cs 스크립트를 다음과 같이 수정합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public List<GameObject> targets;
private float spawnRate = 1.0f;
void Start()
{
StartCoroutine(SpawnTarget());
}
IEnumerator SpawnTarget()
{
while (true)
{
yield return new WaitForSeconds(spawnRate);
int index = Random.Range(0, targets.Count);
Instantiate(targets[index]);
}
}
// Update is called once per frame
void Update()
{
}
}
게임을 시작하면 코루틴이 시작되고, 1초마다 랜덤한 타겟을 생성하게 됩니다.
이제 타겟을 클릭하면 파괴되게 해봅시다.
Target.cs 스크립트를 다음과 같이 수정합니다.
게임을 시작하면... 어떤 게임이 연상되듯이 바닥에서 오브젝트들이 랜덤하게 생성되며 클릭 시 제거 되는 것을 확인 할 수 있습니다.
'Unity > Unity 기초' 카테고리의 다른 글
Unity 강의 8일차 (3) - 게임 오버와 재시작 (0) | 2025.01.31 |
---|---|
Unity 강의 8일차 (2) - 점수 기록 (0) | 2025.01.31 |
Unity 강의 7일차 (3) - 파워업 및 카운트다운 (0) | 2025.01.22 |
Unity 강의 7일차 (2) - 플레이어 따라가기 (0) | 2025.01.22 |
Unity 강의 7일차 (1) - 시점 설정 (0) | 2025.01.22 |