유니티 21

Particle System으로 만들어진 GameObject의 Rotation이 안되는 문제

게임에서 폭발 이펙트의 Prefab이 Particle System으로 이루어져있다. 스크립트에 Bullet이 Target의 위치에 따라 각도 조절이 되어야 하는데, 각도 조절이 적용이 안되는 문제가 발생. var angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; Quaternion arrowAngle = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = arrowAngle; Particle System이 문제가 될거라는 갓리적 의심을 해서 찾아보니 맞다. Particle System의 Renderer를 들어가서 Render Alignment를 Local로 수정해주면, 해당 Rotation이 정상..

유니티 2023.03.28

UI Panel, Prefab으로 지정하여 모든 Scene에서 로딩

WavePanels를 Prefab으로 만들어둔다. 이후, 불러오기 위해서는 Resources 경로에다가 저장해둔다. Script에서 GameObject로 WavePanels을 지정한다음, Start에서 Instantiate로 WavePanels Prefab을 불러온다. 이때, UI이기 때문에 SetParent를 이용해서, 부모 Canvas를 지정해준다. 여기서는 "PopUpCanvas"라는 부모를 두고, WavePanels를 자식으로 지정해줌. 다음에 WavePanels의 위치를 조정해주기 위해서 .GetComponent()을 이용한다. 위치의 경우 anchoredPosition을 이용하여 (0,0,0) = Vector3.zero 에 위치시킨다. 지맘대로 Scale이 변하는 문제도 있었기 때문에, loc..

유니티 2023.03.27

[유니티] DateTime.Utc로 시간 기록/시분초 구현하기

타이머를 만들기 위해서 TimeSetup.cs를 만들었음. 여기서 DateTime.UtcNow를 이용해서 세계 표준시를 가져올 수 있다. using System; using UnityEngine; public class TimeSetup : MonoBehaviour { public static TimeSpan timestamp; public static int CheckTime() { timestamp = DateTime.UtcNow - new DateTime(2000,1,1,0,0,0); //2000년 1월 1일 0시 기준 현재의 time int timesecond = (int)timestamp.TotalSeconds; //시간을 초로 환산 return timesecond; } } 위에서 정해둔 Che..

유니티 2023.03.16

[유니티] Prefab을 Script에서 불러오기(Resource 폴더 사용)

Prefab을 별도의 드래그 없이, Script에서 불러올 때 쓰는 방법. 아래와 같이 지정하면, 이미 해당 경로에 저장된 prefab을 불러올 수 있다. Assets/Resources/buildEffect01.prefab 여기서 중요한 것은, Assets/Resources 폴더 안에 prefab을 넣어놔야 한다는 점. GameObject를 가져오는 것이기 때문에 (GameObject)를 이용해서 불러오면 된다. public GameObject buildEffect; void Start() { buildEffect = (GameObject)Resources.Load("buildEffect01"); } 자세한 내용은 아래 링크를 참고했음. Unity - Scripting API: Resources.Load..

유니티 2023.03.16

[C#] 한 글자 씩 나타나게 하는 방법. Substring 이용.

적고 싶은 글자를 WarningTextValue에 적어둔 다음에, Substring을 이용하여 한글자씩 나타나도록 한다. TextUpdateInterval로 시간 간격을 정한다음에, Time.time으로 시간을 업데이트 하는 방식 사용. const float TextUpdateInterval = 0.1f; //글자가 나타나는 시간 간격 const string WarningTextValue = "Warning...."; //적으려는 텍스트 [SerializeField] Text WarningText; //텍스트 연결해주고 int TextIndex = 0; float LastUpdateTime; void Update() { float currentTime = Time.time; if(currentTime -..

유니티 2023.03.12

[유니티] DOTween이용해서 Panel 깜빡이기

보스가 등장했음을 알리기 위해서 빨간색으로 배경이 깜빡이게 했다. DOTween을 이용했고, 보스가 등장하기 전에 Panel을 Red → White → Red → White로 바꿔줌. 정확히는 이미 Red인 Panel의 투명도를 조정하는 것이다. DOFade()를 이용하면 됨. 추가로 Feel을 이용해서 카메라를 흔드는 것도 구현. mainCamera에다가 MMCameraOrthographicSizeShaker를 설정해두고 Play() 시키기만 하면 된다. using MoreMountains.Feedbacks; using DG.Tweening; void bossAlarm() { playShake(); panelRed(); Invoke("panelWhite",0.75f); Invoke("panelRed",..

유니티 2023.03.09

[유니티] EASY SAVE와 GPGS를 이용하여 클라우드 저장하기

간신히 여기저기 물어가며 알아가면서 EASY SAVE와 GPGS를 이용하여 클라우드 저장하기에 성공. EASY SAVE는 유니티 에셋에서 돈주고 사면 되고.. GPGS는 찾아보면 이용하는 방법이 잘 나와있기 때문에 하기 쉽다. GPGS에 저장하는 형식은 byte이므로 ES3.LoadRawBytes를 이용해서 형식을 변경해주고 Save를 진행한다. Load(또는 Read)의 경우에는 거꾸로 byte 형식의 데이터를 string(ES3 저장 형식)으로 변환시켜줘야한다. Encoding.UTF8.GetString()을 이용해야 함. EASY SAVE와 GPGS를 이용하여 깔끔하게 클라우드 저장 이용! using UnityEngine; using UnityEngine.UI; using System.Text; /..

유니티 2023.03.05

[유니티] 블루투스 헤드폰, 이어폰, 스피커 사용 시 소리 멈추는 현상

유니티로 만든 앱에서, 블루투스 헤드폰, 이어폰, 스피커를 이용할 때 앱을 내렸다 올리면 소리가 멈추는 현상이 있다. 마찬가지로, 블루투스 오디오 연결된 상태에서 애드몹 광고를 보고 돌아오면 소리가 멈춘다. 가장 잘 알려진 해결 방안으로는 Player>Other Settings에서 'Mute Other Audio Sources'를 체크하는 방법이 있다. 하지만, 해당 방법을 이용하면 앱을 이용하면서 노래를 듣거나 유튜브를 듣거나 하는 데에 불편함이 있음... 해결방법을 결국 못찾고, Workaround만 찾아보았는데 AudioSettings.Reset() 을 이용하는 방법이다. AudioSettings.Reset()로 소리를 구현하면, 1. 배경음악이 처음부터 다시 시작하기 때문에 자연스럽지 않고.. 2..

유니티 2023.03.01

[유니티] GameObject 머지(merge), 합치기 구현하기

두개의 GameObject를 하나로 합치기. 게임을 만들다 보면 다양하게 활용할 수 있다. 대략적인 순서는 아래로 보면 된다. 1. 본체1과 본체2 (동일한 물체)가 있음 - 본체1과 본체2에는 DragObject.cs 2. 본체1을 클릭하면 본체1의 dummy가 생성(MouseDown, MouseDrag) - 본체1의 dummy에는 dummyDragObject.cs 3. 본체1의 dummy가 본체 2와 닿은 상태에 mergyReady가 True. - 이때 RigidBody는 Trigger를 체크해야 함. - OnTriggerEnter, OnTriggerStay, OnTriggerExit 이용하여 mergyReady의 상태 변화 필요. 4. mergyReady가 True인 상태에 MouseUp을 하면 본..

유니티 2023.02.24

[유니티] Profiler를 이용하여 최적화 하기

게임을 돌리다 보면 어느 한 장면에서 좀 버벅거리는 경우가 있음. 그럴 땐 CPU를 누가 잡아먹는지 찾아서 스크립트를 최적화 할 필요가 있다. 특히 스크립트에서 void Update()를 남용하게 되면 그런 현상이 꽤나 있음. Window>Analysis>Profiler로 찾아들어가도 되고, Ctrl+7 을 눌러도 뜬다. 그러면 뭐가 얼마나 차지하는지 살펴보자. 이것저것 클릭해보면 대충은 감을 잡을 수 있음. CPU를 누가 많이 먹는지 보자. Others는 유니티를 돌아가게 하는 부분이라서 어쩔수 없는 부분이고, Script가 혹시라도 중간중간 튀는지 확인해볼 필요가 있다. 주기적으로 Script의 CPU Usage가 높아졌는데, 아래 Hierarchy 탭에서 찾아들어가니 TrainBullet.cs의 U..

유니티 2023.02.24