해당 문제는 android.app.application 만 실행이 되고 Custom Application은 실행이 되지 않아서 발생한 현상으로 casting이 안되는 이슈입니다.


많은 사용자를 대응을 하다보면  간혹 이런 현상을 발견을 한다.


안드로이드 스튜디오로 빌드할 경우 발생하는 현상으로 보인다.


삼성 디바이스 7.0 누가 버전에서 발생하는 문제로 보이지만 어찌됐든 안드로이드 앱 운영자라면 모든 케이스를 대응을 할 수 밖에 없는게 현실이기 때문에


방어코드를 추가해보고자 한다.



1. allowBackup을 false로 설정


해당 기능은 앱에서 쓰는 파일들을 백업을 한다고 한다. 재부팅을 하고 다시 로드할때에도 해당 정보를 다시 재사용을 한다고 구글에서는 말하고 있다.


보안에 취약하기 때문에 해당 기능을 false로 설정하고, tools:replace에 android:allowBackup을 추가해준다.


AndroidManifast.xml

<application
android:name="com.application.MyApplication"
android:allowBackup="false"
android:icon="@drawable/ibk_icon"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/app_theme"
tools:replace="android:icon, android:theme, android:allowBackup">



2. 싱글톤 패턴을 이용해서 MyApplication을 Get


MyApplication.java

public static MyApplication mMyApplication = null;
public static MyApplication getInstance() {
return mMyApplication;
}

@Override
public void onCreate() {
if (L.isEnable()) L.logD("YJS is started.");
mMyApplication = this;

}


public void attachBase(Context context) {
attachBaseContext(context);
}

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}


RootActivity.java

public class RootActivity extends Activity {

public MyApplication getRealApplication() {
return getRealApplication(getApplicationContext());
}

private MyApplication getRealApplication(Context applicationContext) {
MyApplication application = null;

if (applicationContext instanceof App) {
application = (MyApplication) applicationContext;
} else {
if (App.getInstance() == null) {
MyApplication myApplication = new MyApplication();
myApplication.attachBase(applicationContext);
myApplication.onCreate();
}

application = MyApplication.getInstance();
}

return application;
}
}


Posted by 서영준

이 글은 Unity Object 이동 및 회전과 애니메이션의 속도 조절하는 Tip을 설명합니다.



1. 우선 움직일 Object(돌고래)를 아래 링크로 다운을 받습니다.

      다운 링크 : https://www.assetstore.unity3d.com/kr/#!/content/3547 

      그후 import를 하여 예제 프로젝트에 추가합니다.

      정상적으로 import를 하였다면 Project Tab -> Favorites -> All Models에 돌고래가 보일 겁니다.

    




2. 돌고래를 이동 시키기 위한 Object를 추가하고, 그 안에 돌고래를 넣습니다.





3. 돌고래를 이동 및 회전 시키기 위한 자바스크립트 파일 생성


      돌고래 이동은 transform.position의 인자인 x, y, z값을 가지고 제어 합니다.

      돌고래 회전은 GameObject.Find("우리가 추가한 Object 명").transform.Rotate(Vector3(X, Y, Z) * speed * Time.deltaTime); X, Y, Z 값을 가지고 원하는 방향으로 회전 시킵니다.

      

      // File Name : Move.js


function Start() {
}

var speed : float = 1;
var max : int = 0;
var rateValue : int = 80;

function Update () {
    max = max + 1
    
    if (max < 200) {
        transform.position.x += (0.24 / rateValue);
        transform.position.y -= (0.17 / rateValue);
        rateValue = 80;
    } else if (max < 400) {
        transform.position.x += (0.24 / rateValue);
        transform.position.y -= (0.17 / rateValue);
        rateValue = 60;
    } else if (max < 500) {
        transform.position.x += (0.24 / rateValue);
        transform.position.y -= (0.17 / rateValue);
        rateValue = 35;
    } else if (max < 900) {
        transform.position.x += (0.08 / rateValue);
        transform.position.y -= (0.13 / rateValue);
        GameObject.Find("Object").transform.Rotate(Vector3(10, -50, -10) * speed * Time.deltaTime);
        rateValue = 20;
    } else {
        transform.position.x += (0.34 / rateValue);
        transform.position.y -= (0.17 / rateValue);
    }
    
    if (max > 1500) {  // 초기 상태로 Roll Back Source Code
        GameObject.Find("Object").transform.position = new Vector3(-5.52.5, -5);
        GameObject.Find("Object").transform.localEulerAngles = new Vector3(3303100);
        max = 0;
    }
}



4. 위에서 만든 자바스크립트 파일을 Object의 Component에 Drag하여 추가 합니다.

    - Object의 Position(x, y, z)를 설정하여 초기 시작 위치를 설정

    - Object의 Rotation(x, y, z)를 설정하여 초기 시작 방향 설정





5. 이제 돌고래의 애니메이션 속도, 크기를 설정 합니다.


 - "humpback_whale_model_baked_animation"의 'Scale'값으로 초기 시작할때 돌고래 크기를 설정 합니다. 

   저는 처음에 조금하게 보여야 하기에 0.1로 설정 하였습니다.




 - 위 그림과 같이 'DolphinMove' 자바스크립트 파일로 애니메이션 속도 및 돌고래 크기를 조절 합니다.

   현재 사용하고 있는 애니메이션을 Get하여 속도를 '7'로 설정 하였습니다.

   'max'값이 1500이 되기 전까지 'scale'값을 계속 0.0006씩 상승 시켜서 점점 커지게 하였습니다.

   

               // File Name : DolphinMove.js


#pragma strict
var animAnimation;
function Start () {
    for (var state : AnimationState in anim) {
        state.speed = 7;
    }
}
var max : int = 0;
function Update () {
     max += 1;
     if (max < 1500) {
        transform.localScale.x += 0.0006;
        transform.localScale.y += 0.0006;
        transform.localScale.z += 0.0006;
    }
    
    if (max > 1500) {
        transform.localScale.x = 0.1;
        transform.localScale.y = 0.1;
        transform.localScale.z = 0.1;
        max = 0;
    }

}



이상


Posted by 서영준

유니티에서 동영상 배경을 투명하게 처리하는 방법은 Shader를 이용해서 합니다.

Shader란 정의를 찾아보았으나 없었고,

제가 생각하기에 Shader란 자바스크립트 계열의 일종으로 보입니다.(제 생각)

우선 Shader를 알고 있다는 상황으로 알고 설명 드립니다.


1. Create -> Plane 추가


2. Project 탭에서 마우스 우클릭 ->  Create       


가. Movie Play C# 파일 생성

using UnityEngine;

using System.Collections;

public class ChromakeyMovie : MonoBehaviour {

    public MovieTexture movie;

    void Start () {

        renderer.material.mainTexture = movie as MovieTexture;

        movie.Play ();

        movie.loop = true;

    }

    void Update () {   

    }

}


나. Shader 파일 생성 (배경이 검정색 일때 가정하에 구현되어 있음, 검정색이 아닐경우 "Chroma"의 Color RGB 값을 변경하면 됩니다.) 

Shader "Transparent/Cutout/ChromakeyShader" {
    Properties {
         _MainTex ("Base (RGB)"2D) = "white" {}
         _Sens ("Sensibilidad"Range (0,0.1)) = 0.3
         _Cutoff("Cutoff"Range(00.05)) = 0.1
         _Color ("Chroma"Color) = (000)
    }
    
    SubShader {
        Tags { "Queue"="Transparent" "RenderType"="Transparent" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        float _Cutoff;
        float _Sens;
        half3 _Color;


        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input INinout SurfaceOutput o) {
            half4 c = tex2D (_MainTexIN.uv_MainTex);
            o.Albedo = c.rgb;
            
            float aR = abs(c.r - _Color.r) < _Sens ? abs(c.r - _Color.r) : 1;
            float aG = abs(c.g - _Color.g) < _Sens ? abs(c.g - _Color.g) : 1;
            float aB = abs(c.b - _Color.b) < _Sens ? abs(c.b - _Color.b) : 1

            float a = (aR + aG + aB) / 3

            if (a < _Cutoff) {
                o.Alpha = 0;
            } else {
                o.Alpha = 1;
            }
        }
        ENDCG
    }
    FallBack "Diffuse"
}


3. 1번에서 추가한 Plane을 클릭하여 우리가 생성한 C#파일을 "Add Component"에 Drag하여 추가, Shader도 설정하면 Shader 설정 완료  



# 추가적인 내용

모바일로 재생하고 하고자 하면, 유니티에서 제공 해주는 "MovieTexture"로 재생이 불가합니다. 폰트도 필요하면 Bitmap Font를 다운 받야아 합니다.

유료로 AssetStore에서 다운을 받아야 하는데, 동영상을 10초 가량만 하고 싶으시면 Asset Store에서  "SPlugins MovieTexture for Mobile Free"를 다운 받아서 import하여 C#으로 만든 파일을 대치하면 됩니다.

(다운 링크 : https://www.assetstore.unity3d.com/kr/#!/content/32877 )

단, Shader에 동영상을 Drag 한 것은 삭제 Play가 됩니다. 


이상 


Posted by 서영준