Tag : Untagged
Component : Transform, Sprite Renderer, Rigidbody 2D, Box Collider 2D, Driver(Script), Delivery(Script)
Rigidbody 2D : Gravity Scale를 0 변경하여 조작하지 않아도 중력에 의해 떨어지지 않도록 하였다
Driver(Script) :
움직임을 담당하는 스크립트이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class Driver : MonoBehaviour
{
[SerializeField]float steerspeed = 300f;
[SerializeField]float movespeed = 20f;
[SerializeField]float slowSpeed = 10f;
[SerializeField]float boostSpeed = 30f;
[SerializeField]float roadSpeed = 20f;
[SerializeField]float grundSpeed = 15f;
void Update()
{
float steerAmount = Input.GetAxis("Horizontal") * steerspeed * -1 * Time.deltaTime;
float moveAmount = Input.GetAxis("Vertical") * movespeed * Time.deltaTime;
transform.Rotate(0,0,steerAmount);
transform.Translate(0, moveAmount ,0);
}
private void OnTriggerEnter2D(Collider2D other) {
if (other.tag == "SpeedBoost"){
movespeed = boostSpeed;
}
else if (other.tag == "Road" && movespeed < 20){
movespeed = roadSpeed;
}
}
private void OnCollisionEnter2D(Collision2D other) {
movespeed = slowSpeed;
}
}
Update 메서드를 사용하여 매 프레임마다 실행시켰다
[SerializeField]float steerspeed = 300f;
[SerializeField]float movespeed = 20f;
[SerializeField]float slowSpeed = 10f;
[SerializeField]float boostSpeed = 30f;
[SerializeField]float roadSpeed = 20f;
steerspeed : 회전 속도를 담당하고 있는 변수이다.
movespeed : 이동속도를 담당하고 있는 변수이다.
slowspeed : 페널티 속도를 담당하고 있는 변수이다.
boostspeed : 부스트시 적용되는 속도를 담당하고 있는 변수이다.
roodspeed : 도로에 진입 시 적용되는 속도를 담당하고 있는 변수이다.
모든 변수는 float를 사용하였다.
모든 변수 앞에 [SerializeField]를 사용하여 유니티의 인스펙터창에서 수정 가능하게 하였다.
[유니티] 변수를 안전하게 Inspector뷰에서 수정하기('[SerializeField]')
Unity 게임 개발에서 변수의 접근 제한자를 설정하는 것은 매우 중요한 부분입니다. 특히 캐릭터의 움직임 속도, 체력, 마나 등과 같은 변수를 다룰 때 이러한 변수를 적절하게 관리하고 수정할
a-full-moon.tistory.com
float steerAmount = Input.GetAxis("Horizontal") * steerspeed * -1 * Time.deltaTime;
float moveAmount = Input.GetAxis("Vertical") * movespeed * Time.deltaTime;
매 프레임마다 이동하는 거리를 계산하여 변수 안에 넣는 코드이다.
steerAmount = 좌우 입력값 * 회전 속도 * -1 * Time.deltaTime
moveAmount = 상하 입력값 * 이동 속도 * Time.deltaTime
steerAmount에 -1을 곱한 이유는 인풋으로 받는 좌우 입력값과 게임 오브젝트의 회전 좌우 값의 부호가 반대로 적용되기 때문이다.
인풋 왼쪽입력 값 > -1, 게임오브젝트 왼쪽방향으로 회전 > +
Time.deltaTime을 이용해 기기의 성능에 따라 이동 속도가 다르지 않도록 고정했다.
transform.Rotate(0,0,steerAmount);
transform.Translate(0, moveAmount ,0);
트랜스 폼을 이용해 캐릭터 오브젝트를 회전시키고 앞뒤로 이동시켰다.
게임 오브젝트를 회전시키는 것을 이용함으로써 좌우로 이동하지 않고 원하는 방향을 이동하였으며 차량에 자연스러움 움직임을 만들었다.
private void OnTriggerEnter2D(Collider2D other) {
if (other.tag == "SpeedBoost"){
movespeed = boostSpeed;
}
else if (other.tag == "Road" && movespeed < 20){
movespeed = roadSpeed;
}
}
Collider2D의 is trigger 기능을 이용하여 도로나 부스트 구역을 진입하였을 때 이동속도를 변경하였다.
콜라이더에 진입했을 때 if문을 사용하여 콜라이더의 태그를 확인하여 부스트 구역이나 도로를 확인하여 이동속도를 변경하였다.
private void OnCollisionEnter2D(Collision2D other) {
movespeed = slowSpeed;
}
트리거기능을 이용하지 않는 구조물과 부딪쳤을 때 속도를 낮추는 역할을 한다.
Delivery(Script) :
배달 시작과 완료를 담당하는 스크립트이다.
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class Delivery : MonoBehaviour
{
bool hasPackage;
[SerializeField] Color32 hasPackageColor = new Color32 (1,1,1,1);
[SerializeField] Color32 noHasPackageColor = new Color32 (1,1,1,1);
[SerializeField]float destroydelay = 1;
SpriteRenderer spriteRenderer;
private void Awake() {
spriteRenderer = GetComponent<SpriteRenderer>();
}
private void Start() {
spriteRenderer.color = noHasPackageColor;
}
private void OnTriggerEnter2D(Collider2D other) {
if(other.tag == "Package" && !hasPackage){
Debug.Log("package picked up");
hasPackage = true;
Destroy(other.gameObject, destroydelay);
spriteRenderer.color = hasPackageColor;
}
else if(other.tag == "Package" && hasPackage ){
Debug.Log("이미 배달할 물건을 가지고 있습니다.");
}
else if(other.tag == "Customer" && hasPackage ){
Debug.Log("package picked down");
hasPackage = false;
Destroy(other.gameObject, destroydelay);
spriteRenderer.color = noHasPackageColor;
}
else if(other.tag == "Customer" && !hasPackage){
Debug.Log("배달할 물건이 없습니다.");
}
}
}
bool hasPackage;
[SerializeField] Color32 hasPackageColor = new Color32 (1,1,1,1);
[SerializeField] Color32 noHasPackageColor = new Color32 (1,1,1,1);
[SerializeField]float destroydelay = 1;
haspackage는 bool을 사용하여 배달할 물건을 가지고 있는지 없는지를 저장한다.
hasPackageColor과 noHasPackageColor은 Color32 타입을 사용하여 캐릭터의 변하는 색깔을 저장하는 변수이다.
색깔 값이 복잡하기 때문에 [SerializeField]를 사용하여 인스펙터 창에서 변경하였다.
destroydelay는 배달 시작과 완료 구역 트리거가 활성화 됐을 때 구역이 사라지는 시간을 정하는 변수이다.
private void Start() {
spriteRenderer.color = noHasPackageColor;
}
spriteRenderer.color를 사용하여 캐릭터의 색을 초기화한다.
private void OnTriggerEnter2D(Collider2D other) {
if(other.tag == "Package" && !hasPackage){
Debug.Log("package picked up");
hasPackage = true;
Destroy(other.gameObject, destroydelay);
spriteRenderer.color = hasPackageColor;
}
else if(other.tag == "Package" && hasPackage ){
Debug.Log("이미 배달할 물건을 가지고 있습니다.");
}
else if(other.tag == "Customer" && hasPackage ){
Debug.Log("package picked down");
hasPackage = false;
Destroy(other.gameObject, destroydelay);
spriteRenderer.color = noHasPackageColor;
}
else if(other.tag == "Customer" && !hasPackage){
Debug.Log("배달할 물건이 없습니다.");
}
}
Collider의 트리거 기능을 이용하여 콜라이더에 진입하였을 때 태그를 조건문을 이용하여 확인하고 배송하는 시스템의 코드이다.
콜라이더 안에 진입하면 조건문을 사용하여 시작지점의 태그인 package인지 확인하고 && 사칙연산을 활용하여 haspackage 안에 false인지 확인한다.
flase일시 Debug.Log를 이용해 물건을 집었다고 콘솔에 출력하고 haspackage의 값을 true로 변경한다.
Destory를 이용하여 시작지점을 없애고 spriteRenderer.color을 이용하여 캐릭터의 색을 변경한다.
도착지점의 구역에도 태그만 다르게 사용하여 배달시스템을 구현했다.
2023.09.20 - [유니티] - [유니티] Delivery Driver 제작 (1) 게임 디자인
[유니티] Delivery Driver 제작 (1) 게임 디자인
게임 목표 : 캐릭터를 조작하여 배달 할 물건을 받고 정해진 구역으로 이동하여 배달 완료 하기 규칙 및 시스템 : 규칙 > 물건을 받을수 있는 구역과 배달 완료 할 수 있는 구역이 정해져 있고 배
a-full-moon.tistory.com
'유니티 > 유데미【한글자막】 C# Unity 게임 개발자 2D' 카테고리의 다른 글
[유니티] Snow Boarder 제작 (1) 게임 디자인 (0) | 2023.09.27 |
---|---|
[유니티] Delivery Driver 제작 (4) 맵 구성요소 (0) | 2023.09.27 |
[유니티] Delivery Driver 제작 (3) 카메라 이동 (0) | 2023.09.27 |
[유니티] Delivery Driver 제작 (0) 유데미 강좌 1 (0) | 2023.09.20 |
[유니티] Delivery Driver 제작 (1) 게임 디자인 (0) | 2023.09.20 |