개발하다가 메모 하나...
다른 클래스 타입의 여러가지 오브젝트를 하나의 목록에 넣을 때,
배열 혹은 리스트를 사용하게 되는데...
C#의 object 는 System.Collections.Generic.List<T> 에 넣으면 Null Reference Exception 이 발생한다.
object[] 로 배열로 넣고 사용하면 된다.
2017년 8월 14일 월요일
2017년 8월 8일 화요일
구글지도로 위도 경도 URL 로 던지기
구글맵스에 아래와 같이 위도 경도 URL을 보낼 수 있다.
아래 링크는 판교역 1번 출구 근처
https://www.google.co.kr/maps/@37.3951627,127.1117136,18.5z
@위도,경도,줌 (15~18정도가 적절?)
--------------------------------------------
마커도 같이 보내고 싶으면 아래와 같은 방법으로 가능하다.
q= 로 표시할 지도의 경도 위도를 보내고
ll= 로 마커 찍을 경도 위도를 보낸다.
z=는 줌 레벨이다.
http://maps.google.com/maps?&z=18.5&q=37.3951627,127.1117136&ll=37.3951627,127.1117136
아래 링크는 판교역 1번 출구 근처
https://www.google.co.kr/maps/@37.3951627,127.1117136,18.5z
@위도,경도,줌 (15~18정도가 적절?)
--------------------------------------------
마커도 같이 보내고 싶으면 아래와 같은 방법으로 가능하다.
q= 로 표시할 지도의 경도 위도를 보내고
ll= 로 마커 찍을 경도 위도를 보낸다.
z=는 줌 레벨이다.
http://maps.google.com/maps?&z=18.5&q=37.3951627,127.1117136&ll=37.3951627,127.1117136
MacBook 에서 XPS로...
의욕적으로 구입했던 맥북프로 2016 15인치 터치바에서
XPS 13 으로 이전할 결심을 굳혔다. 이유는...
1. 맥북프로가 자기 몸값을 못하는 것 같다. 이렇게 고사양 모델을 구입할 필요가 없구나.
(다음에 구입하게 되면 절대로 엔트리 모델에 SSD만 올려서 사야겠다. )
2. 빌드 퀄리티가 그렇게 좋다는 XPS 한번 써보고 싶다.
3. 요새 개발환경 윈도우도 괜찮은거 같다. (+ 내 회사 업무 환경과 같다...)
4. XPS 에 썬더볼트 단자가 있어서 eGPU 를 장착할 수 있기 때문에 추후 업그레이드가 가능하다. (전송속도는 반토막이라고들 하지만... 그게 어딘가?! )
2017년 7월 26일 수요일
어떤 오브젝트의 Mirror 된 회전 값은? (쿼터니언 거울 반전)
쿼터니언으로 미러링 할 때 메모
오일러앵글이 아니라 쿼터니언의 회전은 이해하기 어려울 수 있다.
회전각을 반전시키는 것은 더더욱...
예를 들기 위해 obj의 로컬로테이션을 미러하고 싶다고 가정했다.
보통은 아래와 같이 생각하지만,
실제로는 아래와 같아야 하고,
위도 비슷하지만 비틀림이 있기 때문에 아래와 같이 사용하는 것이 옳다.
참고 URL : https://www.gamedev.net/forums/topic/599824-mirroring-a-quaternion-against-the-yz-plane/
추가 메모 :
카메라 방향이 그대로 일 때 어떤 오브젝트의 이동과 회전을 거울 반전시키려면
포지션 x 축도 바꿔준다. (localPosition.x * - 0.1f)
오일러앵글이 아니라 쿼터니언의 회전은 이해하기 어려울 수 있다.
회전각을 반전시키는 것은 더더욱...
예를 들기 위해 obj의 로컬로테이션을 미러하고 싶다고 가정했다.
보통은 아래와 같이 생각하지만,
new Quaternion(obj.localRotation.x * -1.0f, obj.localRotation.y, obj.localRotation.z, obj.localRotation.w);
실제로는 아래와 같아야 하고,
new Quaternion(obj.localRotation.x * -1.0f, obj.localRotation.y, obj.localRotation.z, obj.localRotation.w * -1.0f);
위도 비슷하지만 비틀림이 있기 때문에 아래와 같이 사용하는 것이 옳다.
new Quaternion(obj.localRotation.x, obj.localRotation.y * -1.0f, obj.localRotation.z * -1.0f, obj.localRotation.w);
참고 URL : https://www.gamedev.net/forums/topic/599824-mirroring-a-quaternion-against-the-yz-plane/
추가 메모 :
카메라 방향이 그대로 일 때 어떤 오브젝트의 이동과 회전을 거울 반전시키려면
포지션 x 축도 바꿔준다. (localPosition.x * - 0.1f)
2017년 6월 23일 금요일
Unity 에서 쓸 수 있는 CSV Reader (C#)
간단히 스트링 저장해놓고 불러 쓰는 용도로 사용하려고 준비...
개행은 \n이 아니라 br 태그로 사용하도록 만듬.
# CSVReader Class
#사용법
csv 파일을 하나 만든다 내용은 아래와 같다.
개행은 \n이 아니라 br 태그로 사용하도록 만듬.
# CSVReader Class
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class CSVReader
{
static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
static char[] TRIM_CHARS = { '\"' };
public static List<Dictionary<string, object>> Read(string file)
{
var list = new List<Dictionary<string, object>>();
TextAsset data = Resources.Load(file) as TextAsset;
var lines = Regex.Split(data.text, LINE_SPLIT_RE);
if (lines.Length <= 1) return list;
var header = Regex.Split(lines[0], SPLIT_RE);
for (var i = 1; i < lines.Length; i++)
{
if (lines[i].Replace(" ","").Substring(0, 2) == "//")
{
Debug.Log(lines[i]);
}
else
{
var values = Regex.Split(lines[i], SPLIT_RE);
if (values.Length == 0 || values[0] == "") continue;
var entry = new Dictionary<string, object>();
for (var j = 0; j < header.Length && j < values.Length; j++)
{
string value = values[j];
value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");
value = value.Replace("</ br>", "\n");
value = value.Replace("</ comma>", ",");
object finalvalue = value;
int n;
float f;
if (int.TryParse(value, out n))
{
finalvalue = n;
}
else if (float.TryParse(value, out f))
{
finalvalue = f;
}
entry[header[j]] = finalvalue;
}
list.Add(entry);
}
}
return list;
}
}
#사용법
csv 파일을 하나 만든다 내용은 아래와 같다.
key,value
a,a value
b,"b, value"
c,"c</ br>line break"
Assets/resources/kpaper.csv 에 파일이 있다고 가정하고 아래 코드 실행List<Dictionary<string,object>> data = CSVReader.Read ("kpaper");
for(var i=0; i < data.Count; i++) {
Debug.Log ("key " + data[i]["key"] + " " +
"value " + data[i]["value"]);
}
2017년 6월 20일 화요일
Unity 엔진 난독화 도구 Obfuscator
최근 개발 중인 프로그램의 출시 시즌이라 이래저래 배포 문제를 해결하고 있다.
유니티로 개발한 프로그램은 Managed\Assembly_cshap.dll 파일에 C#으로 짠 코드 대부분이 쉽게 보이게 되는 문제가 있다.
쉽게 코드를 보고 변조할 수 없도록 Encryption 을 걸면 좋겠지만, C# 특성상 적용이 어렵다.
최소한 난독화라도 걸고 출시해야 할 것 같아서 여러가지 솔루션을 찾아봤는데...
난독화 도구로는 아래 에셋이 좋은 것 같다. (JJ 감사합니다.)
옵션은 조금 만져줘야 하지만, 크게 손이 안가고 가장 편하고 확실한 느낌이다.
(물론 맞춰서 코드도 조금 고쳐야 하긴 했지만)
사용법은 구입 -> 설치 -> Editor\Beebyte\Obfuscator\ 안의 옵션 파일을 설정해주면 된다.
라벨:
게임개발,
팁,
Obfuscator,
Unity
2017년 6월 13일 화요일
Unity 개발 팁, 자식 게임 오브젝트 찾기 간단 팁
자식찾기 간단 팁
보통은 GameObject.Find("string Object Name")을 사용하지 말라고 여기저기 나와있다.
성능 이슈가 있으면 개선하는게 맞지만,
굳이 개발 편의를 위해 있는 기능을 무조건 지양하는 것도 옳지 않은 것 같다.
코드가 줄어들 수 있고, 이해하기 쉽다면 어느정도는 적극 사용하는것도 좋겠지.
예를 들어 어떤 부모 오브젝트의 자식중에서 라고 한정해서 찾는다면 어떨까?
이것도 너무 빈번하게 찾는다면 문제가 되겠지만, 적은 수에서라면 비교적 덜 문제가 되지 않을까?
이를 시험해서 성능 평가 까지 적으면 좋겠지만, 시간이 없어서 테스트 코드만 간단히...
여기다가 SendMessage() 같은걸로 뭔가 동작시켜줄 수 있겠지.
이 두개를 사용하면 아이템 리스트와 하위 아이템을 좀 더 각각 독립적으로 만들어주는데 유용해서 은근히 쓰고 있다.
보통은 GameObject.Find("string Object Name")을 사용하지 말라고 여기저기 나와있다.
성능 이슈가 있으면 개선하는게 맞지만,
굳이 개발 편의를 위해 있는 기능을 무조건 지양하는 것도 옳지 않은 것 같다.
코드가 줄어들 수 있고, 이해하기 쉽다면 어느정도는 적극 사용하는것도 좋겠지.
예를 들어 어떤 부모 오브젝트의 자식중에서 라고 한정해서 찾는다면 어떨까?
이것도 너무 빈번하게 찾는다면 문제가 되겠지만, 적은 수에서라면 비교적 덜 문제가 되지 않을까?
이를 시험해서 성능 평가 까지 적으면 좋겠지만, 시간이 없어서 테스트 코드만 간단히...
// 아래와 같이 자식 오브젝트에서 이름을 적은 녀석을 데려올 수 있다.
// transform의 하위에서 이름으로 찾고 그녀석의 gameobject 를 반환한다.
GameObject childObject GameObject.transform.Find("string Child Name").gameobject;
여기다가 SendMessage() 같은걸로 뭔가 동작시켜줄 수 있겠지.
이 두개를 사용하면 아이템 리스트와 하위 아이템을 좀 더 각각 독립적으로 만들어주는데 유용해서 은근히 쓰고 있다.
피드 구독하기:
글 (Atom)