BMFONT로 Font를 뽑으면 데이터가 커진하고 믿겠지만, RGBA 4개 채널에 폰트데이터를 넣으면 용량이 매우 작아진다.
단적인 예로 우리가 흔히 쓰는 나눔폰트나 Noto 폰트의 경우 각각 용량이 4M, 15~16M에 달한다.

* 나눔폰트 용량
사용자 삽입 이미지
* Google Noto sans CJK Kor 
사용자 삽입 이미지

그런데, Packed Font로 뽑으면...
사용자 삽입 이미지
1024*1024 텍스쳐 한장으로 딸랑 782KB 이다. 
(주의 : 유니티에 Import 하는순간 True Color Texture는 1024에서 4M가 소요된다. 하지만, 512라면 1M에 불과해진다. 폰트사이즈 32정도면 512에 떨어지니 실망하지 말자)
특히, Font 파일을 앱속에 탑재함으로써 발생하는 기타 여러 잡다한 문제도 없고 형좋고 매부 좋고, 암튼 사용하는 방법에 대해 알아보자.

먼저, BM Font 설치하고 한글 파일을 다운로드받자.

- BMFONT : http://www.angelcode.com/products/bmfont/
- 한글텍스트파일 : http://www.wolfpack.pe.kr/attachment/1142498515.txt

이제 BM Font를 실행하고 다음과 같이 설정한다.
* 자세한 BM Font 사용법은 http://www.wolfpack.pe.kr/806 

1. 폰트 셋팅에서 Size를 62정도 입력했을때 1024사이즈에서 공간이 남았었다. (Super Sampling을 켜서 폰트가 이쁘게 나오게 하자.)
사용자 삽입 이미지
2. 익스포트 옵션에서 Bit Depth를 32로 변경하고 "Pack chars in multiple channels" 옵션을 켜자.
사용자 삽입 이미지
3. 이제 익스포트하고 Unity3d로 옮겨 놓자.
사용자 삽입 이미지
4. Texture Import 옵션을 다음과 같이 Advance로 바꾼후 변경하자.
사용자 삽입 이미지
5. NGUI Font Maker를 열어서 폰트를 만든다.
사용자 삽입 이미지
6. 파일이 생성된 모습. 하지만, 하나 더 남았다.
사용자 삽입 이미지
7. NotoFont 메터리얼을 Inspector 창에서 확인하면 쉐이더가 "Unlit/Transparent Colored"로 되어 있을텐데 이걸 "Unlit/Transparent Packed"로 변경해야 한다.
사용자 삽입 이미지
8. 적용결과
사용자 삽입 이미지

* 물론 Dynamic Font로 적용하면 편하다! 하지만, Texture Resize 될때 종종 스냅드래곤을 채용한 핸드폰에서 폰트가 사라지거나 별별 문제가 다 발생하고 그거 잡는 시간에 BMFont로 뽑는게 더 빠르다.
* Packed Font는 외곽 효과라던가... 이팩트 먹이기가 다음과 같이 잘 안된다. 
사용자 삽입 이미지


2015/08/28 17:11 2015/08/28 17:11
오늘은 지난시간에 이어 Json.net으로 Serialize와 Deserialize에 대해 알아보자.

Serialize는 흔히 직렬화라 이야기하기도 한다. 네트워크상에서 Class를 전송하는 등의 입출력을 위한 데이터의 배열 형태로 변환하는 과정을 직렬화라 하며,
반대의 경우 데이터의 배열 형태를 Class로 변환화는 과정을 Deserialize(역직렬화)라 한다.

이때의 데이터 형태는 Byte 또는 string 등의 형식으로 변환 될 수 있다.

암튼 각설하여 지난 시간에 이어서 JSON.NET 모듈을 구해서 Import 하던가 기타 등등의 Json Parser를 구하자.
(코딩 노가다 안하려면 Serialize / Deserialize 지원이 잘되는 모듈로 구하자. 안그럼 개고생은 예약해 놓은 거다)

Import가 완료 되었다면 지난시간에 사용한 Entity Class를 다음과 같이 고쳐주자. (본 예제는 JSON.NET을 사용한다. Windows어플에서 가장 많이 쓰이는 모듈이라서...)
using System.Collections.Generic;
using System.Collections;
using Newtonsoft.Json;

public class TestEntityRoot
{
//JsonProperty로 설정하였다.
 [JsonProperty("SubEntity")]
//Static이므로 Get; Set; 선언으로 입출력이 가능하도록 하였다.
 public static List<SubEntity> SubEntity { get; set; }
}

public class SubEntity
{
 public string x { get; set; }
 public string y { get; set; }
 public List<Sub2Entity> sub { get; set; }
}

public class Sub2Entity
{
 public int z;
}


이제 Json Code가 포함된 Scene 0 에 사용할 코드를 작성하자.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Scene0Behavior : MonoBehaviour {
 // Use this for initialization
 void Start () {
//JSON 데이터를 정의한다. x는 a, y는 b로 선언했다.
 string _json = @"{
           ""SubEntity"": [
            {
                       ""x"": ""a"",
                       ""y"": ""b"",
                       ""sub"" : [
                       {""z"" : 0 },
                       {""z"" : 1 }
                       ]
                      }
            ]
            }";
 //할당할때는 아무런 클래스를 선언하고 할당한다.
 var _e = JsonConvert.DeserializeObject<TestEntityRoot>(_json);
 
//접근할때는 엔티티 클래스를 직접 호출한다.
 Debug.Log("Scene 0 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
            Debug.Log(_s.x);
 }
 Debug.Log("Scene 0 입력값끝##############");
//저장된 Json 데이터를 출력하고 다음 레벨을 로딩한다.
 Application.LoadLevel(1);
 }

}


Scene1에 사용될 소스를 다음과 같이 입력한다. Scene0과 다른점은 Json데이터 외에 변하는 것은 없다.
(단지 씬이 변경되더라도 데이터가 살아 있고 새로운 데이터를 넣었을때 어떻게 되는지 보여준는데 그 역할이 있다.)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Scene1Behavior : MonoBehaviour {

 // Use this for initialization
 void Start () {

 string _json = @"{
            ""SubEntity"": [
            {
                       ""x"": ""c"",
                       ""y"": ""d"",
                       ""sub"" : [
                       {""z"" : 2 },
                       {""z"" : 3 }
                       ]
                       }
            ]
            }";
 //할당할때는 아무런 클래스를 선언하고 할당한다.
 var _e = JsonConvert.DeserializeObject<TestEntityRoot>(_json);
 //접근할때는 엔티티 클래스를 직접 호출한다.
 Debug.Log("Scene 1 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
 Debug.Log(_s.x);
 }
 Debug.Log("Scene 1 입력값끝##############");

 Application.LoadLevel(2);

 }

}


마지막으로 Scene2에서 사용될 소스는 데이터를 클리어 하고 입력된 값을 출력하는 코드이다.
using UnityEngine;
using System.Collections;

public class Scene2Behavior : MonoBehaviour {

 // Use this for initialization
 void Start () {
//시작과 동시에 데이터를 날려버린다.
 TestEntityRoot.SubEntity.Clear();
 Debug.Log("Scene 2 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
 Debug.Log(_s.x);
 }
 Debug.Log("Scene 2 입력값끝##############");

 }

}


결과는 다음과 같다.
사용자 삽입 이미지
정상적으로 씬이 변경되더라도 데이터가 살아 있고, 새로운 Serialize 된 데이터가 들어오면 추가된다.

2015/08/11 01:47 2015/08/11 01:47
유니티3D는 사전 정의된 폴더(Special Folder)를 가지고 있다.

Assets : 기본적으로 소스를 포함하고 있는 폴더
Editor : 유니티에서 사용되는 사용자 정의 에디터 폴더
Gizmos : 기즈모 리소스
Plugins : 플러그인 파일들 하위 폴더로는 "iOS"와 "Android"가 Native Path로 설정됨
Resources : Resources.load로 런타임에서 호출가능한 리소스 폴더
Standard Assets / Pro Standard assets : 일반적인 유니티 패키지를 import했을때 사용하는 폴더
StreamingAssets : 비디오 파일이나 원화 같이 프로젝트 소스가 참조하는 리소스를 넣는다고 되어 있으나, 데스크탑 계열에서는 읽고 쓰기가 가능하지만, 모바일은 읽기만, 웹플레이어는 아에 설정이 불가.
(왜 필요한지...?)
WebPlayerTemplates : 이건 그림으로 설명하자면, 웹플레이어의 경우 템플릿을 설정할 수 있는데...
사용자 삽입 이미지
이때 사용하는 폴더로 구조는 다음과 같음.
사용자 삽입 이미지

중요한건 빌드 순서일터,
(왜냐하면 플러그인을 import하고 많은 분들이 그냥 내버려 둠으로써 Compile 순서가 꼬이는 등의 문제가 있을 수 있기 때문)

총 4단계를 거치는데, 

Phase 1: Standard Assets,Pro Standard Assets,Plugins.
Phase 2: Standard Assets/Editor,Pro Standard Assets/Editor,Plugins/Editor.
Phase 3: Editor 폴더 밖에 있는 스크립트
Phase 4: 나머지 스크립트

끝.
2015/02/21 03:47 2015/02/21 03:47
유니티3D에서 자이로 효과를 카메라에 적용하는 스크립트입니다.
(Marker 없이 자이로로만 캐릭터를 바닥에 닫게 한다던가... 그럴때 사용하는...)

using UnityEngine;
using System.Collections;

public class CameraPivot : MonoBehaviour
{
 float _BaseAngle = -90f;

 void Start()
 {
 Input.gyro.enabled = true;
 }

 void Update()
 {
 Quaternion q1 = Input.gyro.attitude;
 Quaternion q2 = new Quaternion(q1.y, -q1.z, -q1.x, q1.w);

 transform.rotation = Quaternion.Euler(new Vector3(q2.eulerAngles.x, _BaseAngle, q2.eulerAngles.z));
 if (transform.rotation.eulerAngles.z <= 275f && transform.rotation.eulerAngles.z > 180f)
 transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 275f));
 if (transform.rotation.eulerAngles.z >= 355f || transform.rotation.eulerAngles.z <= 180f)
 transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 355f));
 }
}


1. 빈 게임오브젝트 만들어서 이름 바꾼뒤에 아래와 같이 스크립트 포함시킵니다.
사용자 삽입 이미지
2. Pivot 해줄 오브젝트 만들어서 다음과 같이 Rotation값을 (90, -90, 0)으로 설정합니다.
사용자 삽입 이미지
3. 마지막으로 Gyro camera를 설정한다.
사용자 삽입 이미지
4. Main Camera에서 다음과 같이 설정해주면 끝!
사용자 삽입 이미지

* Marker기반 AR과의 차이점.
1. Zoom in-out이 수동임.
2. 화면 Center를 중앙으로 인식함.
3. 회전이 수동임. (축이 고정되어 자동으로 먹히게 하는것 처럼 보이는 건 https://github.com/keijiro/GyroCam 참고)

2015/01/19 17:20 2015/01/19 17:20
씬간 데이터를 이동한다던가...
씬내에서 SQL처럼 데이터를 읽거나 쓰고 싶을때가 있을 것이다.

이전에는 playerprefs 에다가 JSON으로 데이터를 넣어두고 씬마다 리셋했는데... 
연구를 하다보니 씬 이동에도 불편하게 Dontdestroy 옵션을 설정하지 않아도 사라지지 않는 Entity Class 구현방법을 알게되어 포스팅하게 되었다.

(how to get data in other scene on the unity3d player with C# entity class)

먼저 다음과 같이 List 객체를 가지고 있는 Entity라는 정적 Class를 만들자.
e는 _e class 타입의 List이다. (hash 테이블보다는 일반 DB에 가까워서 List를 자주쓴다. 또한 JSON / XML 의 Deserializing / serializing에 유리하기도 하다.)

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

public static class Entity
{
     public static List<_e> e = new List<_e>();
}

public class _e
{
     public string _s;
}



이제 "test1Behavior" 테스트코드를 다음과 같이 작성하고 Main Camera에 스크립트를 Attach시켜둔다.
using UnityEngine;
using System.Collections;

public class test1Behavior : MonoBehaviour {

void Start () {
 Entity.e.Add(new _e { _s = "1234" });
 Application.LoadLevel(1);
 }
}


씬이름을 test1로 저장하고 새로운 씬을 연다.

위의 코드와 비슷하게 다음과 같이 작성하고 새로운 씬의 Main Camera에 스크립트를 Attach시켜두자.

using UnityEngine;
using System.Collections;

public class test2Behavior : MonoBehaviour {

 void Start () {
 foreach (_e x in Entity.e)
 {
 Debug.Log(x._s);
 }
 }
}


마지막으로 test2로 씬을 저장한 후에 

이로써 모든 작업이 완료 되었다.
build setting 에서 test1와 test2 씬을 차례대로 넣어두자.

이제 실행해보면 다음과 같이 test1Behavior에서 넣어두었던 데이터 "1234"가 새로운 씬에서 작동한다.

사용자 삽입 이미지
2015/01/15 16:06 2015/01/15 16:06
배포시 가장 큰 골치덩어리중 하나는 AndroidManifest.xml 파일 수정문제일 것이다.
Android Plugin을 만들어서 넣자니 짜증나고... 그럴때 간단하게 AndroidManifest.xml 파일을 수정할 수 있는 방법을 공개한다.

프로젝트 Root폴더에 보면 "Temp" 폴더가 생성되어 있을텐데 거길 가만히 보면 "StagingArea"라는 폴더가 보인다.
여기로 들어가면 다음과 같이 폴더가 구성되어 있다.

사용자 삽입 이미지
빌드에서 사용될 각종 Resource 파일들이 보일텐데 이중에 필요한건 
AndroidManifest.xml 파일과 res 폴더 두개이다. 이 2개를 선택해서 CTRL+C 해서 복사하고 
유니티로 돌아와서 "Plugins" 폴더를 만든다음 다시 "Android"폴더를 만들고 거기에 복사해 넣자.
사용자 삽입 이미지
이제 복사한 AndroidManifest.xml 파일을 열어서 마음대로 주무르면 됨. 끝!


2014/10/26 16:21 2014/10/26 16:21
오홍~ =)


2013/12/06 22:44 2013/12/06 22:44
안녕하세요? 글뻥입니다.
한 이틀 정도 이클립스 공부하고 강좌 올립니다. =)
틀려도 뭐라 하지마세염 ㅡㅡ;;
안드로이드 연동 이슈땜시 돌아 버릴려해서, 아무 생각없이 여기 저기 자료 찾아서 연동해봤습니다.
유니티가 자바를 연동하는 방식은 2가지가 있어요.
1. 유니티를 Eclipse로 Export 해서 일부 Class.jar 파일을 뽑은 후에 원하는 대로 Class를 만들어서 다시 Plugin현태로 붙이는 방법
2. 유니티를 Eclipse로 Export한 후에 그 안에서 삽질하는 방법
첫번째는 주로 유료플러그인에서 많이 쓰는 방식이고, 플러그인 만들거 아니니까 포기하고 바로 2번째로 가봅시다.
(사실은 첫번째로 OO 붙이다가 울 이사님 좌절... 옆에서 겜 만드는 저도 좌절... 그래서 겜 만드는 거 급 포기하고 OO붙이는 작업 긴급 붙음... 뭐 이런 시나리오 되겠슴돠..)
암튼 각설하고 유니티를 열고 새로 프로젝트를 만들어요.
그리고 아무 생각하지 말고 게임오브젝트로 GUI TEXT를 넣습니다.
사용자 삽입 이미지

이름을 "TEST"로 변경합니다.
사용자 삽입 이미지

이제 자바파일을 호출할 녀석을 만듭니다.
저는 TestMethod라는 이름으로 스크립트를 하나 만들었습니다.
using UnityEngine;
using System.Collections;

public class TestMethod : MonoBehaviour {

//    public AndroidJavaObject activity;


// 시작하면 자바에 있는 메소드를 호출합니다. 기억합시다. "initActivity"!!!!!
void Start () {
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("initActivity", "unity to android"); //여기가 젤 중요함!
            }
        }
}

//여기는 자바가 호출하는 메소드입니다.
    public void AndroidLog (string a)
    {
        transform.GetComponent<GUIText>().text = a;
}
}
위에 Start땜시 멘붕이 왔죠.
"ㅅㅂ 당췌 이걸 어떻게 찾는고야!!?!!"
하지만, 유니티는 똑똑합니다... UnityPlayerActivity를 상속받은 넘들은 무조건 그냥 이게 먹힙니다.
물론, Manifest에서 설정해줘야 하지만... 설정법은 좀있다 다시 거론하면서 일단 여기까지 하고 넘어갑시다.
그리고 아까 만들어둔 TEST에 Attach합니다.
Player Setting에서는 다음과 같이 설정했습니다.
사용자 삽입 이미지

그리고 인증키도 생성해줬습니다. Create New Keystore를 클릭하시면 됩니다.
사용자 삽입 이미지

이제 Eclipse로 Export!
사용자 삽입 이미지

이제 유니티는 잠시 닫아주셔도 좋습니다. =)
안드로이드 SDK가 깔려있는 폴더를 보면... eclipse가 보이실거예요!
사용자 삽입 이미지
이제 eclipse를 살포시 따블클릭!
1. 파일에 Import를 클릭합니다.
사용자 삽입 이미지

Exit 어쩌구 항목을 클릭하구요...
사용자 삽입 이미지

폴더를 선택하면 끝!
사용자 삽입 이미지

좌측 네비게이션바에 주목해주세요!
사용자 삽입 이미지

src라는 폴더를 계속 열어서 타고 들어가면...
사용자 삽입 이미지

파일이 3개보입니다.
ProcyActivity는 버전을 확인해서 버전이 낮은넘은 그냥 Activity로, 높은 넘은 NativeActivity로 보낸다고 합니다.
뭐... 이런게 있구나 정도로 가볍게 쌩까주시고...
파일을 하나 만듭니다.
사용자 삽입 이미지

저는 "TestJava.java"로 생성했지요....
이제 다음의 소스를 부앜~ 긁어다 붙입니다.
package com.lingo.androidtest;
import com.unity3d.player.*;
import android.os.Bundle;
public class TestJava extends UnityPlayerActivity {
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
   
    public void initActivity(final String messageFromUnity)
    {
        runOnUiThread(new Runnable() {
            public void run()
            {
            UnityPlayer.UnitySendMessage("TEST", "AndroidLog", messageFromUnity);
               }
          });
    }
}
한가지 주의하실점은 UI Thread 테스트를 위해 만든 녀석이
    public void initActivity(final String messageFromUnity)
    {
        runOnUiThread(new Runnable() {
            public void run()
            {
            UnityPlayer.UnitySendMessage("TEST", "AndroidLog", messageFromUnity);
               }
          });
    }
요 부분입니다. 이걸... Thread가 불필요하다면
    public void initActivity(String messageFromUnity)
    {
    UnityPlayer.UnitySendMessage("TEST", "AndroidLog", messageFromUnity);
    }
요롷게 고쳐주세요.
암튼 이제 마지막 순서입니다. Manifest라는 아주 지독한 넘을 고쳐야 하죠!
<activity> 테그가 3개 보일텐데 2개는 날려버리시고...
요렇게 생긴넘이 포함된 Activity 테그만 남겨두신뒤에
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
사용자 삽입 이미지
위와 같이 이름만 ".TestJava"로 변경합니다.
이제 실행!
사용자 삽입 이미지


제가 삽질했던 경험에 따라 몇가지 얻은 정보를 이자리에서 공유해야 겠어요.
먼저, 유니티->자바인 경우
가장 먼저 해야 할건...
UnityPlayerActivity 를 확장한 클래스를 main으로 등록해주는 겁니다.
이건 Manifest에서 진행하는 거죠.
다시말해... Manifest에...
<activity android:name=".TestJava" 어쩌구 저쩌구... >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
</activity>
의 구조로 사용자가 생성한 Class가 물리지 않으면 Fail!
2번째로 사용자가 확장한 클래스는 반드시...
"public class TestJava extends UnityPlayerActivity" 의 구조여야 한다는 점입니다.
이 정도 상황까지 되면 아래와 같은 코드로 호출이 가능합니다.
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("initActivity", "unity to android"); //여기가 젤 중요함!
            }
        }
물론 위의 코드는 다음과 같이 재정의 될 수 있습니다.
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")
 jo.Call("initActivity", "unity to android");
별도로 오브젝트와 클래스를 찾지않아도 되는 아주 훌륭한 상황되겠습니다.
반대로 자바가 유니티를 호출할때는 다음의 순서로 갑니다.
오브젝트, 메소드명, Argument
따라서, 다음과 같은 코드가 작동할 수 있는 것이죠.
Scene에만 떠 있다면 암생각 없이 작동됩니다.
    UnityPlayer.UnitySendMessage("TEST", "AndroidLog", messageFromUnity);


몇 번이나 밥상 엎어 버릴 생각이었는데... 이틀 정도의 삽질로 해결이 되서 다행이네욤.
물론, 플러그인들끼리 Merge하는건 또 다른 문제같습니다.
그롬~ 수고하세욤~
2013/05/06 22:53 2013/05/06 22:53

강좌 들어가지 전에... 포프님 찬양! =)
오늘의 강좌는 포프님의 연산, 상수 강좌를 따라했습니다. (출처 : http://www.gamedevforever.com/71)


프로그래머들이시니 별 어려움 없이 이해하실거라 생각하고 그냥 따라해보세요!

New Graph로 깨끗하게 해준뒤에 "마우스 우클릭하시고" Operation 탭을 보시면 4칙연산자를 발견할 수 있습니다.

사용자 삽입 이미지
minors 찾느라 뺑이 쳤지만... 용서하겠습니다. Subtract라는 알흠다운 단어가 있기때문에.. 흠흠..

unity3D에서 수없이 타이핑했을 Vector3, 그 밑에 자세히 보면 보이는 Vector4가 오늘의 주제입니다.
정확하게는 RGBA를 정의한 Color code입죠.

일단 4가지 연산자를 다 꺼내 놓습니다. (테스트할때는 무조건 무식하게..)
사용자 삽입 이미지
그리고 Constant 탭에서 float4 const 를 클릭합니다.
사용자 삽입 이미지


오른쪽에 Node탭을 클릭하면 값을 입력할 수 있죠.
사용자 삽입 이미지


이렇게 2개를 만들어서 테스트 합니다.
먼저 "X"
사용자 삽입 이미지
그리고 "+"
사용자 삽입 이미지
그리고 또, "/"
사용자 삽입 이미지


마지막으로 "-"
사용자 삽입 이미지


별거 없습니다.
Vector4(0.5f, 0.5f, 0.5f, 0.5f) 값에 Vector4(0.5f, 0.5f, 0.5f, 0.5f)를 곱하면  (0.25, 0.25, 0.25, 0.25) 가 나오니까 당연히 어둡고,

Vector4(0.5f, 0.5f, 0.5f, 0.5f) 값에 Vector4(0.5f, 0.5f, 0.5f, 0.5f)를 더하면  (1.0, 1.0, 1.0, 1.0)이 나오니까 당연히 밝고,
Vector4(0.5f, 0.5f, 0.5f, 0.5f) 값에 Vector4(0.5f, 0.5f, 0.5f, 0.5f)를 나누면  (1.0, 1.0, 1.0, 1.0)이 나오니까 당연히 밝고,

Vector4(0.5f, 0.5f, 0.5f, 0.5f) 값에 Vector4(0.5f, 0.5f, 0.5f, 0.5f)를 빼면  (0, 0, 0, 0)이 나오니까 당연히 안나옵니다.



이제부터 잉여짓 들어갑니다.


상수를 하나만 다음과 같이 추가해봅니다.
사용자 삽입 이미지
추가하는 방법은 Constant 탭에서 float 을 선택하면 됩니다.

사용자 삽입 이미지
아마도 결과는 같겠죠?



이제 지난강좌와 같이 Smapled2D를 넣어 봅시다.
사용자 삽입 이미지


Alpha 설정은 2강에서 이미 했습니다. =)

그리고, 이건 숙제입니다. =) 직접해보시기 바랍니다.

(출처 : http://www.gamedevforever.com/73)

Texture는 아래에 있는걸 사용하세욤.
사용자 삽입 이미지


사용자 삽입 이미지


한가지 주의할 점은 unity에서 Normalmap으로 인식할 수 있도록 다음과 같이 설정 해줘야 합니다.

사용자 삽입 이미지



제가한 버전은... 여기있습니다.
주의 1. 원래 강좌에서 Ambient Color는 유니티에서 무의미합니다. 반사광은 Lightmap이나 LightProbe로... ㅡㅡ;
주의 2. Emission 맵은 제가 만들지 모르므로 패스 ㅡㅡ;;

사용자 삽입 이미지





2013/04/01 00:55 2013/04/01 00:55
동영상중에 하나가 저를 끌어서...

http://indiejam.dk/lazer-valkyriez/


결국 따라서 만든다고 만든게...




그럭저럭 나온것 같네요 =)
2013/01/16 01:46 2013/01/16 01:46