BLOG main image
for our next (37)
Dev (32)
Mac (1)
Windows (2)
FreeTalk (1)
Shell (1)
Private (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'Dev'에 해당되는 글 32건
2011. 10. 20. 13:34
	public static Mesh CreatePlaneMesh(string name, int widthSegments, int heightSegments, int width, int height, bool vertical)
	{
		int width_segments = Mathf.Clamp(widthSegments, 1, 254);
		int height_segments = Mathf.Clamp(heightSegments, 1, 254);

		Mesh m = new Mesh();
		m.name = name;

		int hCount2 = width_segments + 1;
		int vCount2 = height_segments + 1;
		int numTriangles = width_segments * height_segments * 6;
		int numVertices = hCount2 * vCount2;

		Vector3[] vertices = new Vector3[numVertices];
		Vector2[] uvs = new Vector2[numVertices];
		Color[] colors = new Color[numVertices];
		int[] triangles = new int[numTriangles];

		int index = 0;
		float uvFactorX = 1.0f / width_segments;
		float uvFactorY = 1.0f / height_segments;
		float scaleX = width / width_segments;
		float scaleY = height / height_segments;

		float halfWidth = width / 2.0f;
		float halfHeight = height / 2.0f;

		float realX = -halfWidth;
		float realY = -halfHeight;

		for (float y = 0.0f; y < vCount2; y++)
		{
			for (float x = 0.0f; x < hCount2; x++)
			{
				if (vertical)
				{
					vertices[index] = new Vector3(x * scaleX + realX, y * scaleY + realY, 0.0f);
				}
				else
				{
					vertices[index] = new Vector3(x * scaleX + realX, 0.0f, y * scaleY + realY);					
				}

				uvs[index++] = new Vector2(x * uvFactorX, y * uvFactorY);
			}
		}

		index = 0;
		for (int y = 0; y < height_segments; y++)
		{
			for (int x = 0; x < width_segments; x++)
			{
				triangles[index] = (y * hCount2) + x;
				triangles[index + 1] = ((y + 1) * hCount2) + x;
				triangles[index + 2] = (y * hCount2) + x + 1;

				triangles[index + 3] = ((y + 1) * hCount2) + x;
				triangles[index + 4] = ((y + 1) * hCount2) + x + 1;
				triangles[index + 5] = (y * hCount2) + x + 1;
				index += 6;
			}
		}

		m.vertices = vertices;
		m.uv = uvs;
		m.colors = colors;
		m.triangles = triangles;
		m.RecalculateNormals();

		return m;
	}

'Dev > Unity3D' 카테고리의 다른 글

Unity, Audio, and Memory  (0) 2012.01.25
unity3d data path!  (0) 2011.12.14
Unity3D Inspector object 선택후 일괄 처리  (0) 2011.07.02
Unity3D 에서 XML Serialize Encrypt/Decrypt.  (3) 2011.04.22
FindObjectOfType fail.  (0) 2010.12.14
2011. 7. 27. 14:19
Eclipse 에서 Android Library 로 다른 프로젝트 추가해서 사용할 경우
Eclipse 에서 생성한 R.java 와 unity 에서 생성한 R.java 의 id 들이 틀려서 리소스들이 꼬인다..

이럴땐 http://limchaeng.tistory.com/24 에서 merge 한 resource 들을 가지고
Ant 에서 수동으로 R.java(패키지별로) 만들고 그걸 이용해서 Ant 에서 compile 한후 jar 로 묶고
unity 에서 사용하면 된다.

*R.java 만든는 Ant code
<property name="aapt" location="${sdk.dir}/platforms/${target}/tools/aapt.exe" />
<target name="build-aapt" depends="copy-resource">
        <exec executable="${aapt}" failonerror="true">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg value="${output.gen.absolute.dir}" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="${unity3dresource.absolute.dir}" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>
</target>

*compile code
    <target name="build-class" depends="build-aapt" >
        <echo>Build Classes</echo>
        <javac target="1.6" extdirs=""
                destdir="${output.classes.absolute.dir}"
                bootclasspathref="android.target.classpath"
                includeantruntime="false">
            <src path="${output.gen.absolute.dir}" />
            <src path="${source.absolute.dir}" />
            <!-- 링크된 라이브러리들의 소스도 컴파일해준다. -->
            <src path="${android.library.reference.1}/src" />
            <src path="${android.library.reference.2}/src" />
            <src path="${android.library.reference.3}/src" />
            <classpath>
                <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
                <fileset dir="${twitter.libs.absolute.dir}" includes="*.jar" />
                <!-- ************************************************** -->
                <!-- 여기에 외부 라이브러리들을 넣어준다. -->
                <fileset dir="${unity3dlibrary.absolute.dir}" includes="*.jar" />
                <!-- ************************************************** -->
            </classpath>
        </javac>
    </target>
2011. 7. 19. 16:19

메인 activity 를 변경해서 사용( http://limchaeng.tistory.com/23 ) 시 UnityPlayer 상속 받아서 사용 할 수 있다.

onPause() 시 OpenGL surface 변경 관련해서 notify 를 받기 위해 사용했다...
public class OverriderUnityPlayer extends UnityPlayer
{
	public void onSurfaceCreated(GL10 arg0, EGLConfig arg1)
	{
		// TODO Auto-generated method stub
		super.onSurfaceCreated(arg0, arg1);
	}
}
2011. 7. 19. 15:29

* jar 안의 resource 접근 안됨.
* jar 안에 res 폴더랑 /Assets/Plugins/Android/res/ 에 같은 resource 있으면 build 할때 에러남.
* /Assets/Plugins/Android/res/ 폴더의 하위폴더들이 android 표준에 맞지 않으면 build 할때 에러남.

1. 모든 resource 는 /Assets/Plugins/Android/res/ 아래에 있어야 함.

2. 외부 리소스 사용시 unity3d 설치폴더/Unity/Editor/Data/PlaybackEngines/androidplayer/res 에 있는 리소드들을 eclipse android project 상의 res 폴더에 포함시킨후 사용해야 함.(이건, eclipse 에서 build 된 resource id 들과 unity3d 에서 build 할때의 resource id 들을 맞춰주기 위함이다.. 이걸 하지 않으면 리소스 접근할때 리스소들이 꼬인다...--; )

3. 공통으로 쓰는 리소스들 (strings.xml, styles.xml, 등등) 은 수동으로 합쳐준다. (unity 설치폴더/Unity/Editor/Data/PlaybackEngines/androidplayer/res/values/ 에 있는 내용도 포함시켜야 한다.)

4. gen 에서 만들어진 파일들도 모두 /Assets/Plugins/Android/gen 폴더에 복사해야 함.(이건 꼭 필요한지 기억이 나지않는데...unity3d packaging 시 사용하는것 같았던 기억이.....필요하니까 추가 했을것이다.ㅋㅋ). <- 이건 없어도 된다는것을 확인했음..

5. res/ 폴더 규칙에 맞지 않는 리소스들은 /Assets/Plugins/Android/assets 폴더에 넣어 두면 사용 가능함.

6. build 시 package 에러 나면 중복된 resource 가 있는지..res 폴더 규칙이 맞는지..등등 검사해야함.

7. 만약 resouece들이 이상하게 나온다면 eclipse 상에서 만들어지 R.java 와 unit3d 에서 만들어지 R.java 를 비교해서 맞는지 검사후 틀리면 리소스들 잘 정리해야 함. --;  (unity3d 에서 만들어진 R.java 는 /유니티프로젝트폴더/Temp/StagingArea/gen 폴더에서 확인 할 수 있음.
2011. 7. 19. 14:44
자신이 만든 activity 를 main 으로 사용하기 위한 작업.

1. Unity\Editor\Data\PlaybackEngines\androidplayer\src\com\unity3d\player\UnityPlayerActivity.java 파일 의 내용을 자신이 사용할 메인 activity 에 복사한다. (unity 엔진 구동을 위한 내용이 들어있다.)
ex) CustomUnityPlayerActivity.java <- UnityPlayerActivity.java 내용 복사
: full name : com.simple.unity.CustomUnityPlayerActivity

2. 새로 만든 activity 를 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고
2. 새로 만든 activity 의 컴파일이 완료되면 컴파일된 *.class 파일을 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고.
ex) bin 폴더에 컴파일이 된다면 : bin/com/simple/unity/CustomUnityPlayerActivity.class
: /com/simple/unity/CustomUnityPlayerActivity.class 를 CustomUnityPlayerActivier.jar 로 묶는다.

3. AndroidManifest.xml 의 내용 변경.(이것은 PlayerSetting 에서 셋팅하고 나서 build 를 한번 하면 /프로젝트폴더/Temp/ 폴더 아래에 StagingArea 폴더가 생기는데 그 밑에 보면 PlayerSetting 에서  셋팅한 내용이 적용된 AndroidManifest.xml 을 가져올수 있다.
내용을 복사해서 /Assets/Plugins/Android/AndroidManifest.xml 을 새로 만든후 이 파일에서
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
        <activity android:name="com.simple.unity.CustomUnityPlayerActivity"
                  android:label="@string/app_name"
                  android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

위와 같이 수정하고 /Assets/Plugins/Android/ 폴더에 3번에서 새로 만든 AndroidManifest.xml 을 넣어 놓으면 자신이 만든 activity 를 메인으로 사용할 수 있다..

2011. 7. 2. 01:24
아래 코드는 Texture 들을 선택해서 일괄적으로 포멧을 변경하는 코드입니다.
응용하면 다른 타입도 가능합니다.
아래 코드는 Assets/Editor/CusomMenu.cs 에 생성하셔야 합니다.
using UnityEditor;
using UnityEngine;
using System.Collections;

public class CustomMenu : ScriptableObject
{
	// ----------------------------------------------------------------------------
	[MenuItem ("CustomMenu/Texture Format")]
	static void ChangeTexture() 
	{
		SeletedChangeTexture();
	}
	
	static void SeletedChangeTexture()
	{
		Object[] textures = GetSelectedTextures();
		Selection.objects = new Object[0];
		
		int count = 0;
		foreach(Texture2D texture in textures)
		{			
			count++;
			string path = AssetDatabase.GetAssetPath(texture);
			TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
			//texture.wrapMode = TextureWrapMode.Clamp;
			textureImporter.textureType = TextureImporterType.Advanced;
			textureImporter.mipmapEnabled = false;
			textureImporter.npotScale = TextureImporterNPOTScale.None;
			textureImporter.maxTextureSize = 4096;
			textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor;
			AssetDatabase.ImportAsset(path);
			
			Debug.Log(string.Format("[{0}/{1}] ChangeTexture progress : {2}", count, textures.Length, path));
		}
	}
	
    static Object[] GetSelectedTextures()
    {
        return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
    }	
}

'Dev > Unity3D' 카테고리의 다른 글

unity3d data path!  (0) 2011.12.14
Unity3D Mesh Create Code  (0) 2011.10.20
Unity3D 에서 XML Serialize Encrypt/Decrypt.  (3) 2011.04.22
FindObjectOfType fail.  (0) 2010.12.14
Unity Script 와 Obejct-C 연동.  (0) 2010.11.09
2011. 4. 22. 22:19
1. Encrypt
     //-----------------------------------------------------------------------------
    public static void SerializeEncryptObject(string path, object obj, System.Type type, SymmetricAlgorithm key)
    {
        using(FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
            {
                using(StreamWriter sw = new StreamWriter(cs, Encoding.UTF8))
                {               
                    try
                    {
                        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                        ns.Add("", "");
                       
                        XmlSerializer serializer = new XmlSerializer(type);
                        serializer.Serialize(sw, obj, ns);
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogWarning(ex.ToString());   
                    }
                    finally
                    {
                        sw.Close();
                        cs.Close();
                        fs.Close();
                    }
                }
            }
        }
    }   

2. Decrypt
    //-----------------------------------------------------------------------------
    public static string LoadXmlFromEncryptFile(string _filePath, SymmetricAlgorithm key)
    {
        if (File.Exists(_filePath) == false)
        {
            _deserializeErrorString = System.String.Format("File({0}) does not exists", _filePath);
            return "";
        }
       
        using(FileStream fs = File.Open(_filePath, FileMode.Open))
        {
            using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
            {
                using(StreamReader sr = new StreamReader(cs, Encoding.UTF8))
                {
                    try
                    {
                        return sr.ReadToEnd();
                    }
                    catch(System.Exception ex)
                    {
                        Debug.LogWarning(ex.ToString());
                        _deserializeErrorString = ex.ToString();
                    }
                    finally
                    {
                        sr.Close();
                        cs.Close();
                        fs.Close();
                    }
                }
            }
        }
       
        return "";
    }

3. Usage
-
private readonly string SECRET_KEY = "12345678";    // must be 64bit, 8bytes
-
private System.Security.Cryptography.DESCryptoServiceProvider mCryptoProvider = null;
-
mCryptoProvider = new System.Security.Cryptography.DESCryptoServiceProvider();
mCryptoProvider.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY);        mCryptoProvider.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY);

-
SerializeEncryptObject("FilePath", Type, mCryptoProvider);
string xmlString = LoadXmlFromEncryptFile("FilePath", mCryptoProvider);

'Dev > Unity3D' 카테고리의 다른 글

Unity3D Mesh Create Code  (0) 2011.10.20
Unity3D Inspector object 선택후 일괄 처리  (0) 2011.07.02
FindObjectOfType fail.  (0) 2010.12.14
Unity Script 와 Obejct-C 연동.  (0) 2010.11.09
Unity3D 3.0 과 OpenFeint 2.7.4 연동  (4) 2010.11.02
2011. 1. 14. 16:37
잘 되던 놈이 이 에러를 자꾸 내보낸다..

iPhone 에 심어져 있던 app 을 완전 삭제후 다시 설치해서 하니 잘 작동된다.
(provisioning 파일을 갱신해서 그런가~? 흠..)
2011. 1. 10. 15:03
Application 안에 특정 Application 에 대한 AppStore 링크를 넣을 필요가 있는 경우가 있습니다.

그래서, 사용자가 프로그램에서 특정 버튼을 터치 하면 응용 프로그램이 종료되면서
iPhone /iPod Touch 안의 AppStore 프로그램이 실행되고, 곧장 정해진 프로그램의 페이지로 이동됩니다.

예를 들어, 가장 쉽게 생각할 수 있는 경우로 Full Version - Lite Version 의 두 가지 버전을 릴리즈해서 운영하는 경우를 생각해 볼 수 있겠습니다.
이 경우, 무료로 배포되는 Lite 버전(즉, Free 버전)안에서 어떤 동작을 하면 유료 버전을 구입할 수 있는 앱스토어 페이지가 나타나도록 하면 좋을 것입니다. 물론, 현재는 무료 버전 안에서도 유료 구매가 가능하도록 '프로그램 안에서 구매' 기능이 허용되고 있지만, 각각의 방식에는 장단점이 있는 듯 합니다. 아직 많은 사람들이 가장 전통적인 방법에 속하는 유료/무료 따로 릴리즈 방식을 사용하고 있습니다.


그렇다면, iPhone 프로그램 안에서 앱스토어 링크를 넣는 방법은? 간단히 하자면, 데스크탑에서 iTunes 를 실행한 후 원하는 프로그램의 링크를 얻어서 붙여 넣으면 됩니다. 이 경우 링크는 다음과 같은 형태가 됩니다.


그래서 이것을 사용해서 다음과 같은 코드를 삽입하겠지요.

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunes.apple.com/kr/app/funny-cartoon-face/id333209093?mt=8"]];



그런데, 이것은 동작은 하지만, 몇 가지 문제가 있습니다.

첫 째로, http 프로토콜을 사용한다는 것입니다. 따라서, iPhone 에서 실제 테스트를 해 보면, 사파리 브라우저가 실행된 다음, 몇 단계의 리다이렉션이 수행되고, 다시 브라우저가 자동 종료되면서 AppStore 가 실행됩니다.
분명 사용자들이 짜증날 것입니다.

두 번째로, 이것은 심각한 문제인데, 바로 주소 안에 '국가 정보'가 들어가 있다는 것입니다. 위에서 예로 들은 URL 안에도 'kr' 이라는 경로명이 있어서, 한국 스토어로 지정되어 있습니다.
그래서, 이 URL은 한국 앱스토어 계정으로 사용하고 있는 사용자들에게는 아무 문제가 없지만, 그 이외의 사용자들은 다른 나라 계정으로 바꾸라는 에러 메시지가 나타나게 됩니다.

하 나의 프로그램으로 전 세계 사람들이 다운로드 받아서 사용하는데, 그 안에 내포된 링크는 특정 국가용 AppStore 링크만 넣을 수 있다는 것은 큰 문제가 됩니다. 사용자의 국가 설정을 일일이 확인해서 적당한 링크로 바꾸자면? 생각만 해도 끔찍하군요.




그러면, 먼저 두 번째 문제의 해결책부터 알아봅시다.

애플에서는 앱스토어 링크를 보다 사람이 기억하기 쉬운 형태의 URL을 사용할 수 있도록 지원하고 있습니다. 예를 들어, 위의 링크는 아래의 링크로 대체할 수 있습니다.


프로그램의 이름만으로 쉽게 기억할 수 있는 URL 입니다. 게다가 더 좋은 점은!!  바로 URL 안에 국가를 지정하는 경로명이 없다는 것입니다. 이 하나의 URL 만으로 각 사용자가 가지고 있는 계정에 따라 해당 국가의 스토어 안에서 프로그램을 찾아가게 됩니다.
이 URL 은 따로 신청해서 만들거나 하는 절차가 필요 없습니다. 앱스토어에 등록된 프로그램은 모두 이같은 형태의 URL을 사용할 수 있습니다. 단, 프로그램의 이름이 영문자가 아닌 한글이나, 특수 문자가 들어간 경우에 대해서는 어떻게 사용하는지 아직 찾지 못했습니다.


첫 번째 문제의 해결책으로 돌아가 보겠습니다.

이것도 간단합니다. iPhone Application 안에서 앱스토어 링크를 사용하는 경우, http 프로토콜을 사용하지 말고 다른 것을 사용하면 됩니다. 바로 http:// 대신에 itms:// 을 사용하는 것입니다. 당연히 iPhone 이나 iPod Touch 같은 실제 디바이스에서만 동작합니다. 시뮬레이터에서는 테스트 해볼 수 없습니다.
그래서 결론적으로 다음과 같은 URL을 사용할 수 있을 것입니다.

itms://itunes.com/app/FunnyCartoonFace

itms:// 을 사용하면 사파리 브라우저를 거치지 않고 곧장 AppStore 가 실행될 것입니다. 깔끔합니다.

2010. 12. 22. 12:30
http://theeye.pe.kr/entry/how-to-use-build-and-archive-on-new-xcode

unable to copy dsym file into archive
: Try setting 'Generate Debug Symbols' to true in the build settings of the target you're trying to build and archive.

'Dev > iOS' 카테고리의 다른 글

In App Purchase : invalidProductIdentifiers  (1) 2011.01.14
App 안에 Store Link 달기  (0) 2011.01.10
objective C category 내 동일한 함수들  (0) 2010.12.22
xcode weak framework  (0) 2010.12.22
Uninstalling Xcode Developer Tools  (0) 2010.12.21