๐Ÿ’Œ Roll-a-Ball ์ด๋ž€?

โ–ถ Roll-a-Ball - Unity Learn ํŠœํ† ๋ฆฌ์–ผ ๋งํฌ

Unity์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒŒ์ž„ ํŠœํ† ๋ฆฌ์–ผ โ€˜Roll-a-Ballโ€™์„ ์ œ์ž‘ํ•˜์˜€๋‹ค. Unity ์„ค์ •๋ถ€ํ„ฐ, Asset, C# Script ๋“ฑ ์ „๋ฐ˜์ ์ธ ๊ฒŒ์ž„ ์ œ์ž‘ ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ๋‹ค.


๐Ÿค ์ฃผ์š” C# Script

๐Ÿงก CameraController

๊ฒŒ์ž„ ์‹คํ–‰์‹œ, ํ‘œ์‹œ๋˜๋Š” ํ™”๋ฉด์„ Camera๊ฐ€ ๋น„์ถ”์–ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Player ์—ญํ• ์„ ํ•˜๋Š” ๊ณต(ball)์„ 3์ธ์นญ์œผ๋กœ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” Camera ์„ค์ •์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

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

public class CameraController : MonoBehaviour
{
    public GameObject player;

    private Vector3 offset;

    // Start๋Š” ์ฒซ ํ”„๋ ˆ์ž„ ์—…๋ฐ์ดํŠธ ์ด์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    void Start()
    {
        offset = transform.position - player.transform.position;
    }

    // Update๋Š” ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

๐Ÿงก PlayerController

Player๋ฅผ ๋ฐฉํ–ฅํ‚ค๋กœ ์›€์ง์ด๊ณ , ์›€์ง์ด๋Š” speed๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์ด๋‹ค. ๋˜ํ•œ ๋…ธ๋ž€์ƒ‰ ์˜ค๋ธŒ์ ํŠธ์™€ ๋ถ€๋”ชํžˆ๋ฉด ๋“์ ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ, ์ ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๋Š” ์ฝ”๋“œ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

using UnityEngine;

// Unity UI ๋ฐ Input System์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
using UnityEngine.InputSystem;
using TMPro;

public class PlayerController : MonoBehaviour
{

	// ํ”Œ๋ ˆ์ด์–ด ์†๋„ ๋ฐ ํ…์ŠคํŠธ UI ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ public ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
	public float speed;
	public TextMeshProUGUI countText;
	public GameObject winTextObject;

	private float movementX;
	private float movementY;

	private Rigidbody rb;
	private int count;

	// ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ๋•Œ
	void Start()
	{
		// ๋ฆฌ์ง€๋“œ๋ฐ”๋”” ์ปดํฌ๋„ŒํŠธ๋ฅผ private rb ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
		rb = GetComponent<Rigidbody>();

		// count๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 
		count = 0;

		SetCountText();

		// Win Text UI์˜ ํ…์ŠคํŠธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜์—ฌ 'You Win'(๊ฒŒ์ž„ ์˜ค๋ฒ„ ๋ฉ”์‹œ์ง€)์„ ๊ณต๋ฐฑ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
		winTextObject.SetActive(false);
	}

	void FixedUpdate()
	{
		// Vector3 ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  X์™€ Z๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์œ„์˜ horizontal ๋ฐ vertical ํ”Œ๋กœํŠธ ๋ณ€์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
		Vector3 movement = new Vector3(movementX, 0.0f, movementY);

		rb.AddForce(movement * speed);
	}

	void OnTriggerEnter(Collider other)
	{
		// ๊ต์ฐจํ•˜๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— 'Pick Up' ํƒœ๊ทธ๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
		if (other.gameObject.CompareTag("PickUp"))
		{
			other.gameObject.SetActive(false);

			// ์ ์ˆ˜ ๋ณ€์ˆ˜ 'count'์— 1์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
			count = count + 1;

			// 'SetCountText()' ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ).
			SetCountText();
		}
	}

	void OnMove(InputValue value)
	{
		Vector2 v = value.Get<Vector2>();

		movementX = v.x;
		movementY = v.y;
	}

	void SetCountText()
	{
		countText.text = "Count: " + count.ToString();

		if (count >= 12)
		{
			// 'winText'์˜ ํ…์ŠคํŠธ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
			winTextObject.SetActive(true);
		}
	}
}

๐Ÿงก Rotator

์ ์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š” ๋…ธ๋ž€์ƒ‰ ์˜ค๋ธŒ์ ํŠธ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค. ์ด๋•Œ Prefab์ด๋ผ๋Š” ๋ณต์ œ(์ปจํŠธ๋กค ํƒ€์›Œ) ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

using UnityEngine;
using System.Collections;

public class Rotator : MonoBehaviour
{

	// ๊ฐ ํ”„๋ ˆ์ž„์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์—
	void Update()
	{
		// ์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ X์ถ•์œผ๋กœ 15๋„,
		// Y์ถ•์œผ๋กœ 30๋„, Z์ถ•์œผ๋กœ 45๋„ ํšŒ์ „ํ•˜๊ณ  deltaTime ๊ฐ’์„ ๊ณฑํ•˜๋ฉด
		// ํ”„๋ ˆ์ž„์ด ์•„๋‹Œ ์ดˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.
		transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
	}
}

๐Ÿค ๊ฐœ์ธ์  ์ƒ๊ฐ

  • ์ ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜์—ฌ UI TEXT๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์€ ์ƒˆ๋กœ์šด Script์™€ Asset์—๊ฒŒ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๊น”๋”ํ•˜๋‹ค. Asset์€ invisibleํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ• ์„ ๋ถ„๋‹ด์‹œํ‚ค๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.
  • ์ด๋ฒˆ์— ๊ตฌํ˜„ํ•œ CameraController์˜ ๊ธฐ๋Šฅ(3์ธ์นญ์œผ๋กœ Player ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ)์€ ์ •๋ง ๋งŽ์ด ์“ฐ์ด๋ฏ€๋กœ ๊ธฐ์–ตํ•ด๋‘๋ฉด ์œ ์šฉํ•  ๋“ฏ ํ•˜๋‹ค.

โค ์‹คํ–‰ ํ™”๋ฉด ๋ฐ ๊นƒํ—ˆ๋ธŒ ๋งํฌ

Untitled

Untitled

Untitled

โ–ถ ๊นƒํ—ˆ๋ธŒ ๋งํฌ