NetworkBehaviour은 위와 같이 UnityEngine.Networking 클래스를 사용하며 MonoBehaviour을 상속받는다.


따라서, 이것을 사용하기 위해서는 다음과 같이 스크립트 코드를 추가 & 변경해줘야 한다.


using UnityEngine.Networking;

public class Player : NetworkBehaviour {



유니티에서 네트워크 관련 변수 또는 함수 사용을 위해서는 NetworkBehaviour를 사용해야 하기 때문이다.


유니티 네트워크를 사용하여 멀티플레이어 게임을 개발하기 위해서 꼭 필요한 설정이다.


이거 안 하면, 네트워크 관련 코드 그냥 다 못 쓴다.


자세한 목록은 


공식 홈페이지


에서 확인하고, 적절히 사용하도록 하자.

Posted by sungho88
,

DestroyImmediate를 사용하려고 했는데, 설명에는 다음과 같이 나온다.



Destroys the object obj immediately. You are strongly recommended to use Destroy instead.


즉,


Destroy 함수를 사용할 것을 강력하게 추천한다?


왜?


바로 없애면 좋은 것 아닌가?


하지만, 당장 오브젝트를 제거하는 것이 좋은 것이 아니라 나쁜 것이다.


이 블로그를 참조하자



Posted by sungho88
,

유니티 창에서 


1. 상단 메뉴 - File - Build Settings하면 Build Settings창이 열린다.


2. Player Setttings... 를 클릭한다.


3. 상단에 Product Name을 변경해주면된다.




이것이 빌드 후, 모바일에 설치될 때 이름이기 때문이다.

Posted by sungho88
,

유니티에서 안드로이드 모바일 폰으로 빌드를 했을 때,


아이콘이 두 개 생성되는 것을 볼 수 있다.


그 이유를 검색해본 결과,


유니티 개발 시 플러그인을 사용하는 경우가 많은데,


안드로이드 매니페스트(AndroidManifast.xml) 파일이 두 개 존재할 경우, 두 개의 아이콘이 생성된다.


자세히 말하면, AndroidManifast.xml 자체가 두 개여서가 아니라,

 


             <intent-filter>

                 <action android:name="android.intent.action.MAIN" />

                 <category android:name="android.intent.category.LAUNCHER" />

             </intent-filter>


위 코드가 존재하면, 메인화면이므로 아이콘이 1개 생성된다. 


기본적으로 아이콘이 만들어지므로, AndroidManifast.xml를 찾아 들어가서, 위 코드를 없애야한다.


이 블로그에서 해답을 찾았다. 



Posted by sungho88
,

유니티에서 간단하게 앱을 종료시키는 방법은 다음과 같다.


일단, 종료 버튼에 On Click에다가 함수를 연결한 뒤, 아래와 같이 한 줄만 써줘도 버튼을 눌렀을 때 앱은 종료된다.


Application.Quit


이렇게 하게 되면, 앱이 종료된다.


테스트해보기 위해서는 직접 디바이스에서 해야한다.


PC상의 유니티에서는 아무런 반응이 일어나지 않는다.

 


Posted by sungho88
,

1. 자동으로 회전하는 게임오브젝트 만들기


플레이어의 터치나 드래그를 통한 조작이 아니라 자동으로 회전하고 싶다면, 간단하다.


update() 함수에서 프레임마다 호출해주면 된다.


transform.Rotate(0, ySpeed, 0);


이렇게 하면, 해당 오브젝트가 y축으로 자동 회전하게 된다.


균일한 속도로 돌리고 싶다면 Time.deltaTime()을 곱해주면 된다.


transform.Rotate(0, ySpeed * Time.deltaTime(), 0);



2. 모바일에서 터치를 이용해 게임오브젝트 회전하기


y축 방향으로 좌우 360도 회전을 하고 싶다면 다음과 같이 하면 된다.


foreach (Touch touch in Input.touches)
{
if (touch.phase == TouchPhase.Moved)
{
transform.Rotate(0, -touch.deltaPosition.x, 0);
}
}



이렇게 하면, 모바일 터치를 읽어들여, 움직일 때 회전을 하게 된다.



http://madewithunity.blogspot.kr/2015/09/how-to-rotate-object-with-unity-3d.html

Posted by sungho88
,

http://kimseunghyun76.tistory.com/194

http://programmingsource.tistory.com/18 


유니티에서도 안드로이드와 같이 생명 주기가 존재한다.


생명 주기(Life Cycle)이란, 유니티 내부에서 알아서 프로젝트 시작부터 종료까지 진행하는 흐름이다.


즉, 사용자가 직접 만들지 않아도 자동으로 호출되는 메소드가 존재한다.


예를 들면 Awake()와 Start() Update() 등등... 이 함수의 호출 흐름을 말한다.


먼저, 4가지 함수만 알아보자.

 

호출 순서


1. Awake() 

 

- 스크립트가 실행될 때 단 한번만 호출된다.

- 모든 오브젝트가 초기화된 후에 호출되기 때문에 GameObject.Find, GameObject.FindWithTag 등의 명령어들을 

   안전하게 사용할 수 있다.

- Awake 함수는 항상 Start() 함수 이전에 호출되므로 초기화 순서를 정할 수 있게 된다.

- 코루틴(Coroutine) 사용이 불가능하다.


2. OnEnable()


- 인스펙터뷰에서 게임오브젝트를 활성화/비활성화를 체크한다. 즉, 체크(활성화) 되었을 때 호출된다.

- 만약, 게임오브젝트를 껐다가 다시 켜면, Start()는 불리지 않으므로 작동이 되지 않는다.

- 활성화/비활성화를 사용하고자할 때, 이 함수에 활성화되었을 때 일어날 코드를 넣는다.


3. Start()


- Update() 함수가 호출되기 전에 한번만 호출된다.

- 다른 스크립트의 모든 Awake()가 실행이 끝난 이후에 실행된다.

- 스크립트가 활성화되어 있어야만 호출되어 실행된다.


4. Update()


- 매 프레임마다 호출되는 함수이며, 게임 로직에 핵심적으로 사용된다.

- 스크립트가 활성화 되어있어야 사용이 가능하다.

- 일시적으로 사용하지 않으면 불필요하게 성능저하 발생 가능성이 커진다.(매 프레임 반복 실행이므로 1초에 수십번..)



Posted by sungho88
,

초기화를 하지 않았든, 어쨋든 null이 발생할 가능성이 높다.


널 체크는 간단하지만 중요하다. 널 체크를 꼭 해주자. 방법은 다음과 같다.


만약, Image myImage;으로 선언을 한다면,


if (myImage != null)

   XXXXXXXXX


도 물론 가능하지만, 더욱 간단하게 체크할 수도 있다.


if (myImage)

   XXXXXXXXX


이렇게 해도 된다. 


주의할 점 : null이라면, 이 아니라 null이 아니라면 이 조건값이다.


반대로, null일때 뭔가를 해주고 싶다면 부정연산자 !를 붙여서


if (!myImage)

   XXXXXXXXX


로 작성해야 에러가 발생하지 않는다.


다시한번 말하지만, 


!을 사용하지 않는다 = 널이 아닐때.

!을 사용한다 = 널일 때.




Posted by sungho88
,

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class MaterialTest : MonoBehaviour {

public SkinnedMeshRenderer skin;

// Use this for initialization

void Start () {

  skin.GetComponent<SkinnedMeshRenderer>().material.color = Color.black;  // 첫 번째 방법


for (int i = 0; i < 2; i++) {                                                                                    // 두 번째 방법

skin.GetComponent<SkinnedMeshRenderer> ().materials [i].color = Color.black;

}

}

}



1. 첫번째 방법  


skin.GetComponent<SkinnedMeshRenderer>().material.color = Color.black;

쉽게 말하면, material이 한 개일 경우에 이렇게 사용한다. 그냥 material을 호출하면 자동으로 인식되는 경우이다.


2. 두번째 방법


for (int i = 0; i < 2; i++) {                                                                                    // 두 번째 방법

skin.GetComponent<SkinnedMeshRenderer> ().materials [i].color = Color.black;

}


쉽게 말하면, material이 여래 개일 경우에 이렇게 사용한다. 


유니티에서는 보통 materials라 나오며 배열로 표기된다. 

 

이럴 경우에는 for문을 사용해서 material의 갯수만큼 반복하며 material을 조작할 수 있다.


위 코드의 경우 매티러얼이 2개이므로 materials [0] 과 materials [1]을 각각 반복하였다.


이상으로 스크립트에서 material을 사용하는 방법에 대해 알아봤다.

Posted by sungho88
,

버튼에 애니메이션을 실행(Play)시킬 때 발생하는 문제가 하나 있었다.


같은 버튼을 계속 누를 때 최초 1회만 애니메이션이 재생되고, 그 이후 두번 다시 Play되지 않은 문제였다.

 

그래서 틀렸을 때 흔들리는 애니메이션이 1번만 보여지고 그 이후는 무반응이므로 뭔가 어색하게 되었다.


오브젝트를 껐다가 켜야하나 생각도 해보고 구글을 찾아봤지만 한국어 검색으로는 비슷한 문제가 발견되지 않았다.


그래서 형편없는 영어 실력으로 영어 검색을 시작했다.


검색어 : unity animator play once reset


그결과 유니티 커뮤니티에서 어떤 한 외국인님이 나와 완전히 동일한 문제를 질문했고, 답을 얻을 수 있었다.


생각보다 별 것 아니었다. 몰라서 못 쓴 것이지만,,]


내가 사용했던 Play("AnimationName"); 에서 확장된...아니 오버로딩된



public void Play(string stateName, int layer = -1, float normalizedTime = float.NegativeInfinity);


을 사용하라고 한다.



아래 코드가 내가 사용한 기본적인 코드이다. 이렇게 하면 플레이는 된다.


buttonObject.GetComponent<Animator>().Play("ButtonWrong");


하지만,


buttonObject.GetComponent<Animator>().Play("ButtonWrong", -1, 0f);



첫 번째 매개변수 : stateName

두 번째 매개변수 : layer

세 번쨰 매개변수 :normalizedTime


첫 번쨰 매개변수로는 Play할 애니메이션 state의 이름을 적는다.


두 번째 매개변수로는 layer를 설정한다. -1일 경우 첫 state를 재생한다.


세 번째 매개변수로는 normalizedTime를 적는다.


normalizedTime란,


표준화된(normalized) 애니메이션 시간아다. 


값 1은 애니메이션의 끝을 의미하며 값 0.5는 애니메이션의 중간을 의미한다.


Posted by sungho88
,