Essential 4의 내용은 Programming Essential로, 스크립트를 작성하는 방법에 대해 다루고 있는 내용이다.
아직까지는 깊이 있는 스크립트 작성 방법에 대해서 다루고 있지는 않고, 심지어는 당장엔 코드의 내용에 대한 설명보다는 스크립트를 붙여놓고 사용하는 방법에 대해 알려주고, 그 후 간단한 내용에 대한 설명부터 시작한다.
유니티6으로 진행하고 있던 만큼, 인상적이었던 건 아래와 같이 스크립트의 생성 방식이 다르다는 것이었다.
위와 같이 스크립트의 종류를 골라서 생성할 수 있고, 심지어 스크립터블 오브젝트를 바로 생성하는 스크립트도 있었다.
이 부분은 여러 스크립팅 방법에 대해 터득하고, 나중에 유니티6에 대한 R&D가 충분히 되면 꽤 편하게 느낄 부분이라고 생각한다.
튜토리얼에서는 로봇청소기가 먼지를 빨아들이는 방식을 스크립트로 표시하는 방법을 기본 내용으로 제공하고 있다.
이에 따라 로봇 청소기를 플레이어로, 먼지를 이용한 OnTriggerEnter를 설명하는 방식을 따르고 있다.
아래는 유니티에서 제공하는 스크립트의 내용이다.
플레이어를 움직이는 매커니즘 자체는 간단하다.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 5.0f;
public float rotationSpeed = 120.0f;
public float jumpForce = 5.0f;
private Rigidbody rigid;
private void Start()
{
rigid = GetComponent<Rigidbody>();
}
private void Update()
{
if(Input.GetButtonDown("Jump"))
{
rigid.AddForce(Vector3.up * jumpForce, ForceMode.VelocityChange);
}
}
private void FixedUpdate()
{
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = transform.forward * moveVertical * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + movement);
float turn = Input.GetAxis("Horizontal") * rotationSpeed * Time.fixedDeltaTime;
Quaternion turnRotation = Quaternion.Euler(0f, turn, 0f);
rigid.MoveRotation(rigid.rotation * turnRotation);
}
}
using UnityEngine;
public class Collectible : MonoBehaviour
{
[SerializeField] private float rotationSpeed;
public GameObject onCollectEffect;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Rotate(0, rotationSpeed, 0);
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Destroy(gameObject);
Instantiate(onCollectEffect, transform.position, transform.rotation);
}
}
}
using UnityEngine;
public class DoorOpener : MonoBehaviour
{
private Animator doorAnimator;
private void Start()
{
doorAnimator = GetComponent<Animator>();
}
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Player"))
{
if(doorAnimator != null)
{
doorAnimator.SetTrigger("Door_Open");
}
}
}
}
스크립트의 내용 자체는 어려운 것이 없어서 스크립트를 짜면서 내용을 한 번 더 이해하고, 일부 변수명이나 선언한 방식 등은 임의로 수정해서 스크립트를 짰다.
여기서 특히 인상적이었던 건 마지막 심화 과제에 AI를 활용하는 방법에 대해서도 거론하고 있다는 것이었다.
(실제 유니티 강좌에서 제공된 화면이다.)
이와 같이 AI의 사용을 보여주는 방식이 있는 것이 신기해서, 나 또한 강좌에 되어 있는 대로 그대로 챗GPT에 물어보았고, 강좌에서 받은 코드 그대로의 코드가 아니라 조금 더 좋아보이는 버전을 받았다.
Here's a Unity C# script that you can attach to your Directional Light to simulate the passing of a day by slowly rotating it. The duration of a full day (in seconds) is adjustable via the Inspector.
✅ Script: DayNightCycle.cs
using UnityEngine;
public class DayNightCycle : MonoBehaviour
{
[Tooltip("Duration of a full day in seconds.")]
[SerializeField] private float dayDurationInSeconds = 120f;
private float rotationSpeed;
void Start()
{
// 360 degrees in a full rotation (one full day)
rotationSpeed = 360f / dayDurationInSeconds;
}
void Update()
{
// Rotate around the X-axis
transform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime);
}
}
📌 How to Use:
1. Create or select your Directional Light in the scene.
Attach this script to the light (drag it into the Inspector or click "Add Component").
Set the Day Duration In Seconds in the Inspector (e.g., 120 for a 2-minute day cycle).
Play the scene – the light will rotate slowly to simulate day progression.
Let me know if you'd like to sync this with skybox changes or add night lighting!
이와 같은 답변 그대로 Diretional Light에 해당 스크립트를 추가했더니 의도한 대로 빛이 작동하는 것을 확인했다.
2D Essential의 내용에는 아주 큰 특이사항은 있었다. 스크립팅에 대한 부분은 기본적으로 제공되어 있었고, 충돌체2D나 Rigidbody2D가 따로 있다는 사실을 알려주고, Linear Drag, Gravity, Mass 등의 Rigidbody의 요소를 알려주는 등의 내용이 있었다. UI에 대한 부분도 짤막하게 나오고, 마지막으로 고양이를 애니메이팅 하는 과정도 간략하게 알려주는 것으로 내용이 마무리되었다.
Publishing Essential은 게임을 Build하는 과정에 대해서 다루고 있는 튜토리얼이다.
Build 같은 작업도 이미 해 본 거였지만, 유니티6에서의 Build Setting이 조금 다르게 생겼다는 게 특징점이었다.
이와 같이 Player Setting에 바로 이동해서 아이콘을 바꿀 수 있다든지의 특징은 꽤나 유용했던 점이었다.
그리고 Publish에 대해서도 특이한 점이, WebGL로 퍼블리시 하는 방법에 대한 설명이 있었다.
이 WebGL 프로젝트로 Build하는 것이 어떤 것인지 알아봤는데, 유니티 Play로 있는 웹사이트에 웹 게임으로 퍼블리싱 하는 것임을 알게 되었다.
이 사이트도 한 번 들어가보니, 이와 같이 웹상에서 플레이할 수 있는 게임들이 개발자들의 손에서 만들어지고 있음을 알 수 있었다.
이미 많은 게임들이 만들어지고 있는 것을 확인했고, 이것들이 전부 웹 상에서 플레이 가능한 게임이란 것이 놀라웠다.
다만 이렇게 WebGL로 게임을 Build 하고 퍼블리싱을 하려면 유니티 패키지에서 파일을 추가로 받아야 한다.
위와 같이 두 개의 파일을 추가로 다운 받고 게임을 웹 상에서 퍼블리싱 할 수 있다.
또한 이 챕터에서는 아직 써 보지 않은 기능에 대한 설명도 있었다. 바로 Recorder라는 기능인데, 이건 패키지 매니저를 통해서 추가로 다운받아야 하는 부분이다.
패키지를 다운받은 다음 Recorder Window를 추가해보자.
추가된 창에서 어떤 것을 레코드할지 선택할 수 있고, 어떤 시점의 카메라로 레코드를 할지, 화질은 어떻게 할지, 화면 비울 등을 세팅하고, 동영상의 저장 경로 등을 선택할 수 있다.
그 다음 맨 위의 START RECORDING 버튼을 누르면 알아서 게임이 재생되고, 원하는 타이밍에 STOP RECORDING을 누르면 녹화가 종료된다.
그러고 나서 경로의 파일을 보면 녹화 파일이 MP4로 생성되어 있다.
사실은 한 3주 전에 미리 떼고 다음 강좌로 넘어갈 계획이었긴 했지만, 프로젝트 기간이 겹치고 하다 보니 결국 미뤄져서 이제야 끝을 보게 되었다.
유니티를 시작한 초반에 유용한 기능을 배우려고 시작한 강좌인데, 어느새 여기에 있는 내용이 너무 쉽다 느껴질 수준으로 오게 되었다.
하지만 확실히 느낀 건, 이 유니티 강좌 자체는 유니티를 처음 시작하는 사람에게는 굉장히 유용한 강좌가 될 수도 있다는 것이었다.
다만 이것만으로 바로 게임을 만들 수는 없고, 당장의 흥미와 기본적인 사용법을 익히는 과정으로 생각해야 할 것 같다.
하지만 생각보다 과제나 설명 과정이 마치 게임을 하듯이 재미있게 만들었단 점은 장점으로 작용할 수 있을 것 같다.