공유 설정
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 21번째.
난이도 설정은 모든 적을 한 번에 변경하므로, 모든 적이 참조하는 하나의 에셋에 적합합니다. 각 적은 매 프레임 에셋의 속도를 읽고, 메뉴의 Hard 버튼은 같은 에셋에 값을 씁니다:
[CreateAssetMenu(menuName = "Game/Difficulty")]
public class Difficulty : ScriptableObject
{
public float enemySpeed = 2f;
}public class Enemy : MonoBehaviour
{
public Difficulty difficulty;
public Transform player;
void Update()
{
float step = difficulty.enemySpeed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, player.position, step);
}
}// DifficultyMenu.cs, Hard 버튼의 onClick에 연결됨
public Difficulty difficulty;
public void SetHard()
{
difficulty.enemySpeed = 4f;
}적들의 필드와 메뉴의 필드는 하나의 에셋을 참조하므로, SetHard()를 실행한 뒤에는 모든 적의 다음 Update에서 4를 읽습니다. 필드에 해당 에셋이 연결된 프리팹에서 나중에 생성된 적도 포함됩니다. 각 적이 이동할 때 difficulty.enemySpeed를 읽기 때문에 이렇게 작동합니다. Start에서 이 값을 자신의 필드에 복사한 적은 계속 2로 이동합니다.
게임 중 변경한 내용이 어디에 반영되는지는 게임이 실행되는 환경에 따라 달라집니다. 빌드는 시작할 때마다 빌드 당시의 에셋을 불러오므로, 다음 게임에서는 플레이어가 선택한 Hard가 사라집니다. 선택을 유지하려면 PlayerPrefs에 저장하고 게임이 시작될 때 에셋에 다시 써야 합니다. Editor에서는 프로젝트의 에셋이 게임에서 변경하는 대상이며, Stop을 눌러도 변경 사항이 유지됩니다. 이는 Inspector 값으로 돌아가는 씬의 오브젝트와 다릅니다. 다음 Play는 Hard로 시작하고, 에셋의 값은 다시 설정할 때까지 4로 유지됩니다.
챌린지
중급세 척의 범선이 바람에 밀려 만을 가로지르고, 위쪽 및 아래쪽 화살표를 누르면 바람이 0에서 5 사이로 강해지거나 약해집니다. 하지만 각 배에는 자체 windStrength 필드가 있고, WindVane은 자체 strength만 변경하므로 화살표를 눌러도 물 위의 배들은 아무런 영향을 받지 않습니다. 하나의 에셋을 공유하세요. WindSettings.cs는 준비되어 있고, 프로젝트의 Breeze 에셋(strength 2)은 모든 배와 WindVane의 wind 필드에 할당되어 있습니다.
Sailboat:windStrength를 WindSettings 유형의 공개 필드wind로 바꾸고,wind.strength를 사용해 항해하세요.WindVane:strength를 공개 필드wind로 바꾸고, 화살표를 눌렀을 때wind.strength가 변경되도록 하여 모든 배가 바람의 영향을 받게 하세요. 텍스트에는Wind: 3과 같이 표시됩니다.- 빌드를 실행할 때마다 Breeze 에셋이 새로 로드되므로 플레이어의 바람 설정이 사라집니다.
wind.strength가 변경될 때마다 PlayerPrefs 키Wind에 저장하고, Start에서 저장된 값을 에셋에 다시 설정하세요. 새 플레이어는 에셋의 2를 사용합니다.
Play를 누르고 바람을 변경한 다음, Stop을 누르고 다시 Play를 누른 뒤 Check를 누르세요.
직접 해보기
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class WindVane : MonoBehaviour
{
public TMP_Text windText;
public float strength = 2f;
void Start()
{
Show();
}
void Update()
{
if (Keyboard.current.upArrowKey.wasPressedThisFrame)
{
strength = Mathf.Min(strength + 1f, 5f);
Show();
}
if (Keyboard.current.downArrowKey.wasPressedThisFrame)
{
strength = Mathf.Max(strength - 1f, 0f);
Show();
}
}
void Show()
{
windText.text = "Wind: " + strength;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.