Unity Asset - IOS Native Plugins 사용해서 XCODE에서 최종 빌드시 참고사항
더보기 접기
* Unity 5.2.3p3 + INP 8.1
1. ipad pro app ios 9 167 * 167 아이콘 추가.
2. singing 설정
3. GameCenter, In-App Purchase 설정
4. 아래 프레임워크에서 없는 리스트 추가.
- StoreKit.framework
- Accounts.framework
- Social.framework
- MessageUI.framework
- MediaPlayer.framework
- MobileCoreServices.framework
- GameKit.framework
접기
C# - 별도의 게임서버 없이 실제 시간 DateTime 가져오기
더보기 접기
/* 최초 작성일 : 2016년 4월 8일
* 최초 작성자 : 김현욱
* 최종 수정일 : 2016년 4월 8일
* 최종 수정자 : 김현욱
*
* 스크립트 역할
* - 외부 시간 받아오기 담당.
*/
using System;
using System.Collections;
using System.Net.Sockets;
using System.IO;
using UnityEngine;
public class TimeManager : MonoBehaviour
{
public static TimeManager Instance { get; private set; }
public static Action<bool> IsDone;
public static DateTime GetRealTime { get { return Instance.currentTime.AddSeconds(RealTime.time); } }
private DateTime currentTime = DateTime.MinValue;
private float timeOut = 100f;
void Awake()
{
Instance = this;
StartCoroutine(ReceiveRealTime());
}
IEnumerator ReceiveRealTime()
{
TcpClient tcpClient = new TcpClient("time.nist.gov", 13);
StreamReader sr = new StreamReader(tcpClient.GetStream());
// 형태 57486 16-04-08 08:53:18 50 0 0 737.0 UTC(NIST) *
string readData = sr.ReadToEnd();
// 형태 16-04-08 08:57:07
string _time = readData.Substring(readData.IndexOf(" ") + 1, 17);
// 대한민국은 UTC 기준 +9시간.
currentTime = Convert.ToDateTime(_time).AddHours(9);
// Debug.Log("현재 시간 : " + currentTime.ToString("yyyy-MM-dd HH:mm:ss"));
float waitTime = 0f;
while (true)
{
if (currentTime.CompareTo(DateTime.MinValue) == 0)
{
if (waitTime < timeOut)
yield return null;
else
{
InvokeEvent(false);
yield break;
}
}
else
{
InvokeEvent(true);
yield break;
}
waitTime += Time.deltaTime;
}
}
private void InvokeEvent(bool isDone)
{
if (IsDone == null) return;
IsDone.Invoke(isDone);
}
}
접기
Unity API - 자동 화면 잠금 방지
더보기 접기
자동 화면 잠금 방지
Screen.sleepTimeout = SleepTimeout.NeverSleep;
접기
Unity API - 현재 네트워크 연결상태
더보기 접기
* 핫스팟으로 연결되어 있을때 실제 네트워크가 연결되어 있지 않으나 연결상태로 나올 수 있으므로, 실제 네트워크 연결 확인 용도로 사용하기엔 무리가 있음.
Application.internetReachability
ReachableViaCarrierDataNetwork 3g
ReachableViaLocalAreaNetwork wifi
NotReachable 안됨
접기
C# / Unity API - 유니크한 값 생성
더보기 접기
C#
Guid guid = Guid.NewGuid();
TextBox.Text = guid.ToString();
출력 예 : 04C1A6A1-3F3B-4D8B-80C0-4917F83545F5
Unity
SystemInfo.deviceUniqueIdentifier
안드로이드
- 디바이스 고유 ID
아이폰
- iOS6까지 : 맥어드레스 해쉬값.
- iOS7부터 : identifierForVendor 값.
- 따라서 고유의값이긴 하나 iOS7부터는 지웠다 깔면 값이 변경될수는 있음
접기
Unity - 입사각, 반사각, 법선벡터 설명
더보기 접기
입사각, 반사각, 법선벡터
- 당구공 튕기는것은 반사각
- 반사각을 구하기 위해 필요한 것이 입사각과 법선벡터.
* other -> 충돌체의 Collision 데이터.
- 입사각 : Vector3 incomingVector = other.transform.position - firePos;
- 입사각의 반대각 : Vector3 inverseVector = -incomingVector;
- 법선벡터 : Vector3 normalVector = other.contacts[0].normal;
- 반사각 : Vector3 reflectVector = Vector3.Reflect(incomingVector, normalVector);
접기
C# - 시간데이터 비교 (헷갈릴때 참고)
더보기 접기
DateTime aaa = 5/22
DateTime bbb = 5/23
aaa.CompareTo(bbb) -> -1 즉,
- aaa가 bbb보다 과거면 -1
- aaa가 bbb와 같다면 0
- aaa가 bbb보다 미래라면 1
접기
Unity API - Attribute
더보기 접기
[PostProcessScene]
static 함수위 어트리뷰트로 적어주면 씬로딩시마다 함수 실행. 테스트 아직 안해봤는데 OnLevelWasLoaded() 보다 먼저 실행될듯.
------------------------------------------------------------------------
[AddComponentMenu("Transform/Follow Transform")]
public class FollowTransform : MonoBehaviour{}
------------------------------------------------------------------------
[ContextMenu ("Do Something")] 스크립트 우클릭 함수호출
void DoSomething () { Debug.Log ("Perform operation"); }
------------------------------------------------------------------------
[ExecuteInEditMode]
public class example : MonoBehaviour {}
------------------------------------------------------------------------
[HideInInspector] 이전값이 있으면 유지하고 숨김.
public int p = 5;
------------------------------------------------------------------------
[NonSerialized] 초기값 유지하고 숨김.
------------------------------------------------------------------------
[RequireComponent (typeof (Rigidbody))]
접기
Unity - 최적화
더보기 접기
아틀라스가 많아지면 그만큼 텍스쳐 로딩에 할당되는 메모리가 커짐. 드로우콜은 낮아지지만 그런 문제가 있으므로 아틀라스를 최소화시키는게 반드시 필요함. 또한 최적화하는 크기는 1024 * 1024를 유지할 수 있도록 함.
접기
Unity - 단축키
더보기 접기
[Active/InActive HotKey]
Alt + Shift + A
접기
XCODE - 앱 이름 지역화
더보기 접기
* 현재는 Localized App Name 이라는 에셋 싸서 사용하니까.. 별 신경 안써도 될듯.
InfoPlist.strings 지역화 후
CFBundleDisplayName = "App Name";
접기
Facebook SDK - Hashkey
더보기 접기
- 실키해시
keytool -exportcert -alias [Alias 명칭] -keystore [절대경로\abc.keystore] | openssl sha1 -binary | openssl base64
접기
C# - List 임의로 섞기
더보기 접기
Random rnd = new Random();
listTemp.Sort((a, b) => (a == b) ? 0 : rnd.Next(-1, 1));
접기
Unity API - OnApplicationPause()
더보기 접기
OnApplicationQuit 함수는 정상종료시에만 호출됨.
따라서
OnApplicationPause(bool isPause)
{
if(isPause) // 홈버튼으로 아웃될때
else // 다시 어플로 들어올때.
}
를 혼용하여 사용하거나 아예 Quit 함수 자체를 사용하지 않고 다른 방법을 권장함.
접기
버젼관리 - GitHub +Unity
더보기 접기
* 최근 Bitbucket + SourceTree + Unity3D 형태로 생각중..
GitHub-Unity(SVN)
http://seungngil.tistory.com/entry/Unity%EC%97%90%EC%84%9C-GitHub%ED%95%98%EC%9E%90
접기
Unity - 딥 프로파일링 불가시
더보기 접기
딥프로파일링이 불가능할때
Profiler.BeginSample / Profiler.EndSample
접기
C# - ref / out 키워드
더보기 접기
ref -> 반드시 초기화가 필요
out -> 초기화 필요없음.
접기
C# - GC.Collect()
더보기 접기
System.GC.Collect();
- 가비지 컬렉터에게 지금 쓰래기 수거할 시간이라고 알랴줌~ 강제로 수거해라는 의미가 아니라 지금 적절한 시간임 이라고 알려주는 의미.
접기
C# - Action을 사용한 이벤트 처리
더보기 접기
선언 - event Action<object, 각종 정보를 담을 클래스> event함수명;
이벤트 처리. - 각종 정보를 담을 클래스 arg = new 각종 정보를 담을 클래스();
- arg.셋팅.
- event함수명.Invoke(Instace, arg);
이벤트 받기. 다른 스크립트에서 event함수명을 선언한 객체로 접근한 후 (싱글턴이 편함)
- InGameStateManager.event함수명 += 이벤트 발생시 실행할 함수;
이벤트 발생시 실행할 함수에 매개변수로 이벤트 처리시 Invoke로 넘긴 두 매개변수를 받음.
접기
C# - Action 과 무명 메소드를 활용하여 단일 함수 내에서의 이벤트 리스너 처리.
더보기 접기
Action 과 무명메소드를 사용한 단일함수내 이벤트 리스너 처리 방법.
private Action<bool> test;
private void Test()
{ // null 처리
test = delegate(bool isTrue)
{ Print.write(isTrue); }
}
* += 연산자도 상황별로 사용.
접기
Unity - Randering Path
더보기 접기
* http://docs.unity3d.com/kr/current/Manual/RenderingPaths.html
Forward Lighting : 픽셀 단위로 계산, 빛이 많을 수록 계산량 증가, 가장 일반적인 방식.
Vertex Lit : 정점 단위로 계산, 품질이 낮고 그림자 지원 않함.
Deferred Lighting : 빛 정보를 모아 저장 후 나중에 한 번에 수행. 가장 높은 품질을 빠르게 수행, 반투명 처리 힘들고 안티엘리어싱 안됨.
접기
C# - 박싱과 언박싱
더보기 접기
Stack <- int, float등 및 사용자 정의 구조체.
Heap <- string, 클래스, 배열의 인스턴스등.
박싱 -> 값 형식의 자료형이 참조형식의 자료형으로 변환될때의 프로세스. (Stack -> Heap)
언박싱 -> Object 형식에서 값 형식으로, 또는 인터페이스 형식에서 인터페이스를 구현한 값 형식으로 변환하는 것.
* 박싱은 단순참조에 비해 20배 이상 시간소모, 언박싱은 할당에 4배정도 시간소모.
결론. 되도록 제네릭 형식을 사용해서 박싱 및 언박싱이 발생하지 않도록 만드는 방법.
함수 매개변수에 ref와 out을 적절히 사용하는 것도 한가지 방법.
접기
C# - Generic Type의 값 복사
더보기 접기
제네릭 자료형 복사는 메모리주소 링크라고 생각하면 됨.
물리적인 복사를 위해서는 다음과 같이 처리하면 카피된 자료형태로 사용할 수 있음.
Dictionary<string, string> dict = 블라블라블라. (원본데이터)
Dictionary<string, string> copy = new Dictionary<string, string>(dict);
접기
IOS - splash 이미지 크기
더보기 접기
iphone splash 이미지 크기
320x480 Default
640x960 Default@2x (Retina iOS 6.1 ans Prior)
640x1136 Default-568h@2x (Retina 4-inch iOS 6.1 ans Prior)
640x960 Default@2x (Retina)
640x1136 Default-568h@2x (Retina 4-inch)
아이폰(~3GS) 해상도 : 480 * 320
아이폰(4, 4S) Retina (3.5 inch) 해상도 : 960 * 640
아이폰(5) Retina (4 inch) 해상도 : 1136 * 640
아이패드(1,2) 해상도 : 1024 * 768
아이패드(new) Retina 해상도 : 2048 * 1536
아이패드 미니 해상도 : 1024 * 768
아이패드 미니 Retina 해상도 : 2048 * 1536
4월 18일 추가..
Unity 라이센스 구매후 실제 Splash 이미지 적용시 Splash 이미지에 로고를 직접 넣으면.. 디바이스별 해상도 문제때문에 머리가 좀 아픔..
Splash 이미지 로딩 시간은, 앱 시작후 첫 씬의 데이터 크기와 디바이스 스펙에 영향을 받아 시간이 결정됨.
그런고로, Splash 이미지 후 로드되는 씬에 내용을 전부 삭제하고 Splash 이미지는 단일 검은색으로 처리하여 앱시작후 보이는 검은화면과 연계해서 보이도록 하고(이때, 이 로드시간은 갤S2 기준 2초~4초정도 걸린다고 함..노트 3에서는 1초? 정도) 빠르게 그부분을 넘긴 후 가장 첫 씬을 Logo가 보이도록 처리하면 깔끔하게 로고를 보일수도 있고, 원하는 만큼 로고를 보이는 시간을 결정할 수 있음(다만 로고 이후 씬의 데이터양이 많으면 의도한 것보다 길게 보일수 있고, 시간텀을 주지 않으면 디바이스 스펙이 좋을 경우 로고 출력시간이 너무 짧아질 수 있음)
접기