2D 공간에서 이미지 또는 특정 오브젝트를 자유롭게 이동시키고 싶은 경우가 있습니다. 게임 오브젝트를 이동할 때, 의도해서 화면 밖으로 게임 오브젝트가 이동시키는 경우도 있지만, 일반적으로는 게임 오브젝트가 화면 안에서 이동되기를 원할 것입니다. 이런 경우 화면 사이즈와 이동시킬 게임 오브젝트의 사이즈를 계산만 하면 쉽게 구현이 가능합니다. 유니티에서는 화면에 대한 정보를 알 수 있는 Screen이라는 class를 제공하고 2D 오브젝트의 사이즈를 알 수 있는 RectTransform이라는 class를 제공하기 때문에 이 둘을 조합하면 쉽게 계산할 수 있습니다. 이 계산을 할 수 있다면 랜덤으로 오브젝트를 이동시킬 때 범위를 설정할 수 있습니다. 이동시킬 위치의 x 좌표와 y 좌표 각각의 위치의 범위를 정해주면 됩니다. 이런 식으로 구현하면 특정 아이템이나 몬스터, 캐릭터를 랜덤 한 위치에 Spawn 할 수 있고 랜덤으로 원하는 오브젝트를 배치할 수 있습니다.
C# (UNITY 3D)
랜덤 버튼을 누르면 화면의 크기와 이미지의 크기를 계산해서 화면 범위 안에서 이미지가 랜덤으로 이동하는 예시입니다. 이미지는 어몽 어스(Among Us) 캐릭터로 사용하였습니다. 이동했을 때의 현재 위치를 표시합니다.
using UnityEngine.UI;
텍스트, 이미지, 버튼을 사용하기 위해 UnityEnginge.UI를 사용합니다.
각 컴포넌트를 가지고 있는 게임 오브젝트를 스크립트에 할당합니다.
public Text text_pos;
public RectTransform rect_amongus;
public Button button_randompos;
void Start()
{
Init_UI();
}
private void Init_UI()
{
button_randompos.onClick.RemoveAllListeners();
button_randompos.onClick.AddListener(Funciton_RandomPos);
}
//CodeFinder 코드파인더
//From https://codefinder.janndk.com/
private void Funciton_RandomPos()
{
float w = rect_amongus.rect.width;
float h = rect_amongus.rect.height;
float pos_x = Random.Range(w / 2, Screen.width - w / 2);
float pos_y = Random.Range(h / 2, Screen.height - h / 2);
Vector2 pos = new Vector2(pos_x, pos_y);
rect_amongus.position = pos;
text_pos.text = pos.ToString();
Debug.LogFormat("pos x: {0}, pos y: {1}\nscreen x: {2}, screen y: {3}", pos.x, pos.y, Screen.width, Screen.height);
}
변수(variable)
text_pos (Text) : 이동한 게임 오브젝트의 Position을 표시
rect_amongus (RectTransform) : 랜덤으로 이동시킬 게임 오브젝트
button_randompos (Button) : Funciton_RandomPos 함수를 실행할 버튼
함수(function)
Init_UI : 버튼에 기능 할당
Funciton_RandomPos : 버튼을 눌렀을 때 실행되는 함수, 이미지 Screen 안에서의 랜덤 이동
게임오브젝트 스폰 / GameObject Spawn / 화면 사이즈 불러오기 / Get Screen Size / Random Spawn
'Unity3D > C#' 카테고리의 다른 글
유니티 마우스 커서, 이미지 마우스 따라다니게 하기 (Mouse Position) (4) | 2020.11.02 |
---|---|
유니티 마우스 왼쪽/오른쪽/가운데(휠) 버튼 클릭 값 받기 (0) | 2020.11.01 |
유니티 랜덤 색상 추출, RGBA color to hex code (0) | 2020.10.30 |
Unity Pick Random Image (Random.Range, index) (2) | 2020.10.29 |
유니티 범위 안에 있는 랜덤 값 뽑기 (INT, FLOAT) (0) | 2020.10.28 |