짧아서 간단히 실행할 것이라 생각했는데 몇시간동안 고생했다.


Drag 관련 코드는 이미 내장된 함수가 존재한다.


OnMouseDrag() 함수이다.


이 함수를 호출한 뒤, 드래그(Drag) 했을 때 원하는 코드를 적으면 된다.


일단, 움직이고자 하는 게임오브젝트들에 Drag.cs 파일을 갖다 붙인뒤 Drag.cs파일에 코드를 입력한다.


[Drag.cs]


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

public class Drag : MonoBehaviour
{

float distance = 10;

void OnMouseDrag()
{
print("Drag!!");
Vector3 mousePosition = new Vector3(Input.mousePosition.x,
Input.mousePosition.y, distance);
Vector3 objPosition = Camera.main.ScreenToWorldPoint(mousePosition);
transform.position = objPosition;
}
}


불필요한 Start() 함수와 Update() 함수를 삭제하고 OnMouseDrag()함수만 작성했다.


그런데, 아무리 실행을 해봐도 함수가 실행되지 않는다.


그래서 혹시나해서 OnMouse로 시작하는 모든 함수를 작성해보았다.


OnMouseEnter

OnMouseExit

OnMouseUp

OnMouseDown

...

..

.


헉, 모든 마우스 관련 함수가 호출되지 않는다.


여러번의 시도 끝에 혹시나해서 이미지(Sprite)에 Collider를 추가해봤다..


된다. 자~~알 된다. 다만 화면 밖으로 끝없이 드래그(Drag)되지만 움직이는 것은 성공했다.


위와 같이 쓴 다음에 게임을 실행해보면 마우스 드래그로 오브젝트 객체가 이동하는 것을 볼 수 있다.



결론 : 콜라이더(Collider)를 써야 마우스 관련 함수를 사용할 수 있다.


 

Posted by sungho88
,




1. InvokeRepeating


Invokes the method methodName in time seconds, then repeatedly every repeatRate seconds.


Parameters:


    methodName: 

    time: 

    repeatRate:

void MonoBehaviour.InvokeRepeating(string methodName, float time, float repeatRate)


정의는 위와 같다. MonoBehaviour의 상속을 받으므로 바로 사용할 수 있다.



methodName : 호출할 함수명

time : 처음에 몇초동안 딜레이 둘지(0이면 바로 시작)

timeRate : 그 이후에 몇초마다 함수를 부를지 지정한다.


즉, 특정 시간마다 함수를 반복 실행하고자 할 때 이 InvokeRepeating를 사용한다. 아래와 같이 작성하면 된다.


void start(){

   InvokeRepeating("tutorial",2,1);

}


2초 후에 tutorial라는 이름의 함수를 1초마다 무한 반복.


2. Invoke


Invokes the method methodName in time seconds.


Parameters:


    methodName: 

    time:

void MonoBehaviour.Invoke(string methodName, float time)


정의는 위와 같다. MonoBehaviour의 상속을 받으므로 역시 바로 사용할 수 있다.   


methodName : 호출할 함수명

time : 함수 호출 시간(5.0f)라면, 5초 후


void start(){

   Invoke("tutorial",2);

}


2초 후에 tutorial라는 이름의 함수를 2초 후에 한 번 실행.



3. CancelInvoke


Cancels all Invoke calls on this MonoBehaviour.

void MonoBehaviour.CancelInvoke()


[중지]

CancelInvoke(); 

CancelInvoke("methodName"); 

 

InvokeRepeating 의 무한 반복을 중지시킨다. Invoke는 일회성이므로 무시.


매개변수에 아무것도 적지 않으면 모든 Invoke 들을 중지시킨다.


매개변수에 함수명을 적으면 그 특정 함수의 무한 반복만 중지된다.

Posted by sungho88
,

안드로이드에서는 AlertDialog창이 별도로 존재했지만, 


유니티에서는 기본적으로 패널(Panel)을 사용한다.


Create - UI - Panel로 패널을 하나 만든 뒤, Panel안에다가 배치할 UI 요소들을 집어넣는다.


만약, 안드로이드에 존재하는 뒤로가기 버튼을 눌렀을 때 바로 나가버리지 않고 한번 묻는 창을 띄우고 싶다면...


Text하나와 Button 두개를 만든 뒤, 잘 맞춰서 배치한다.


이렇게 하면 창을 만든 것이다. 해야할 것은


1. 시작했을 때 패널은 사라지게 만든다.


2. 뒤로가기 버튼을 눌렀을 때, 이 패널이 나오게 만든다.


나오게 안 나오게 하는것은 게임오브젝트를 활성화 & 비활성화하는 것과 같은 의미이다.


쉽게 말해서 켰다 껐다 할 수 있는것이다.


이것을 가능하게 해주는 게 바로 


SetActive(bool value) 함수이다. GameObject 안에 존재하는 이 함수를 이용해서


true = 켜졌다, 활성화되어 있다, 현재 보이는 상태이다.

false = 꺼졌다, 비활성화되어 있다, 현재 보이지 않는 상태이다.


ㅡㅡㅡㅡㅡㅡㅡㅡ



[시작하면,] 


Start() 함수에서 SetActive(false)로 패널을 비활성화시켜 눈에 보이지 않게 사라지게 하고,


[뒤로가기 버튼을 누를 때]


SetActive(true)로 패널을 활성화시켜서 화면에 띄운다.


이렇게 하면, 패널을 이용한 팝업창 띄우기 성공.

Posted by sungho88
,

if(Application.platform == RuntimePlatform.Android)

{

if(Input.GetKey(KeyCode.Escape))

{

 // Application.Quit();

}

}

 

위 코드는 update()에 넣는다.


이렇게 작성하면, 플랫폼이 안드로이드인지를 확인한 뒤에 


뒤로가기 버튼은 키 코드로는 Escape이다. 


따라서, 코드로 하면 KeyCode.Escape 이다.


이렇게하면, 안드로이드 폰이며 동시에 뒤로가기 버튼을 누른 조건에 해당된다.


// Application.Quit();


이 부분에 원하는 코드를 작성하면 된다.




최종 코드

void Update()
{
creditVal.text = credit.ToString(); // 숫자를 문자로
        // stageVal.text = stage.ToString();
if (Application.platform == RuntimePlatform.Android)
{
if (Input.GetKey(KeyCode.Escape))
{
                Back_Panel.SetActive(true);
}
}
}


Posted by sungho88
,

게임오브젝트에 C# script를 붙이려고 할 때, 에러가 발생한다.(콘솔에는 에러가 나지 않고 경고창만 뜬다.)




이 경우, 유니티에서 보이는 C# script의 이름과 소스로 들어갔을 때, 


클래스 선언 부분에서의 C# script이름이 다르기 때문이다.


동일하게 맞춰주어야 에러가 발생하지 않고 컴포넌트화 할 수 있다.




Posted by sungho88
,

윈도우에서는 유니티를 얼마든지 여러개를 Open할 수 있다. (다른 프로젝트의 경우)


하지만, 맥같은 경우 기본적으로 그렇게 할 수 없다.


이럴 경우, 터미널(terminal)에서 다음과 같이 입력해주면 된다.


> open -na unity


이렇게하면 유니티 시작 창이 열리고, 새로운 유니티 프로젝트를 하나 더 열 수 있다.

Posted by sungho88
,

먼저, C# Script에서 다른 Scene으로 이동을 하기 위해서는 다음과 같다.


1. 코드 상단에 Scene을 관리하는 SceneManagement를 추가해준다. 


using UnityEngine.SceneManagement;


1. Scene 이동하는 코드를 다음과 같다.


SceneManager.LoadScene("Scene_Play");


LoadScene 뒤에 매개변수에는 string으로 된 이동하고자 하는 Scene의 이름이 들어간다.


위 코드같은 경우 Scene_Play로 이동하겠다는 의미이다.


다만, 여러개로 오버라이딩 되어있어 Scene의 이름 이외에도 씬의 번호 또는 다른 것으로도 Scene 이동이 가능하다.


또한, 이동하려고 하는 버튼을 눌렀을 때 에러가 날 수도 있다.


Scene 'Scene_Play' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.

To add a scene to the build settings use the menu File->Build Settings...

UnityEngine.SceneManagement.SceneManager:LoadScene(String)

Source_Title:Press_Play() (at Assets/Scripts/Source_Title.cs:21)

UnityEngine.EventSystems.EventSystem:Update()


새롭게 만들긴 했지만, 아직 Scene에 대한 정보를 갖고 있지 않기 때문이다.


File - Build Settings에서 Scene을 추가해주어야 한다.


밑에 Add Open Scenes 버튼을 클릭하면 현재 Scene이 등록된다.


Scene_Play를 추가해주는 방법은 드래그해서 끌어다 넣으면 된다.


이렇게하면 유니티에게, Scene이 2개가 존재한다는 것을 알리는 의미이다.


이것은 밑으로 누적되는 것이 아니라, 순서를 쉽게 바꿀 수 있다. 

즉, Scene_Play를 Scene_Title위로 마우스 드래그로 쉽게 끌어 올릴수 있다.


그래서 SceneManager.LoadScene(1)과 같이 번호를 쓰게 된다면 Scene이 꼬일 수 있다. 

따라서, SceneManager.LoadScene을 사용할때는 매개변수로 Scene의 이름을 명시해서 사용하는 것이 좋다.

Posted by sungho88
,