'포트폴리오' 카테고리의 다른 글

c++ binary Search Tree  (0) 2019.10.28
c++ STL container 만들기  (0) 2019.10.28
c++ String Class 만들기  (0) 2019.10.28
Projectile 기능  (0) 2019.10.07
에어템플릿(유니티)  (0) 2019.10.07

'포트폴리오' 카테고리의 다른 글

c++ binary Search Tree  (0) 2019.10.28
c++ STL container 만들기  (0) 2019.10.28
c++ String Class 만들기  (0) 2019.10.28
게이트식스 리뷰영상  (0) 2019.10.07
에어템플릿(유니티)  (0) 2019.10.07

 

 

'포트폴리오' 카테고리의 다른 글

c++ binary Search Tree  (0) 2019.10.28
c++ STL container 만들기  (0) 2019.10.28
c++ String Class 만들기  (0) 2019.10.28
게이트식스 리뷰영상  (0) 2019.10.07
Projectile 기능  (0) 2019.10.07
    AndroidJavaClass m_UnityPlayer;
    AndroidJavaObject m_CurrentActivity;
    AndroidJavaClass m_ContextCombat;
    
    // 생성자
    public PermissionManager()
    {
        // Unity Android의 부모역할을 하는 클래스
        m_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        // 현재 실행되고 있는 Android Activity를 가져온다
        m_CurrentActivity = m_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        // 권한여부를 가져올 수 있는 클래스
        m_ContextCombat = new AndroidJavaClass("android.support.v4.content.ContextCompat");
    }
    
    /** GetAndroidPhoneNumber를 Android Code로 이해할 경우.
       public class CurrentActivity extends  UnityPlayerActivity
       {
           protected void GetPhoneNumber()
           {
               TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
               PhoneNumber = tm.getLine1Number();
           }
       }
    */
    public string GetAndroidPhoneNumber()
    {
        string str = "";

        if (m_CurrentActivity == null)
            return "";

        if (IsPermissionGranted(Permissions.READ_PHONE_STATE) == false)
            return "";

        // 액티비티에서 Android Navtive Method 인 "getSystemService"를 호출
        AndroidJavaObject pServiceObj = m_CurrentActivity.Call<AndroidJavaObject>("getSystemService", "phone");
        if (pServiceObj == null)
            return "";

        // 자바 클래스 가져옴
        AndroidJavaClass clazz = new AndroidJavaClass("java.lang.Class");
        if (clazz == null)
            return "";

        // 자바 클래스에 있는 TelephonyManager클래스 가져옴
        AndroidJavaObject pDest = clazz.CallStatic<AndroidJavaObject>("forName", "android.telephony.TelephonyManager");
        if (pDest == null)
            return "";

        //"getSystemService"로 가져온 SystemService Instance를 TelephonyManager로 캐스팅함
        AndroidJavaObject pTelephonyService = pDest.Call<AndroidJavaObject>("cast", pServiceObj);
        if (pTelephonyService == null)
            return "";

        //이로서 pTelephonyService은 TelephonyManager의 인스턴스로 사용가능
        str = pTelephonyService.Call<string>("getLine1Number");
        //Debug.Log("PhoneNumber1 : " + str);

        if (string.IsNullOrEmpty(str) == true)
            return "";

        if (str.Length > 0 && str[0] == '+')
        {
            str = "0" + str.Substring(3);
        }

        //Debug.Log("PhoneNumber2 : " + str);
        return str;
    }

'게임개발 > 유니티' 카테고리의 다른 글

[UniteSeoul 2020] Tips & Tricks For Using Profiler  (0) 2020.12.02
AssetBundle 관리  (0) 2020.04.13
단발성 진동 알람 이벤트 처리  (0) 2019.04.24
unity google play games plugin 연동 문제  (0) 2018.08.17
베지어 곡선  (0) 2017.01.17

필요 예) 게임을 Auto Mode로 설정 한 뒤 설정한 조건에 의해 Auto가 종료 될 경우 이것을 알려주기 위해 핸드폰을 단발적으로 진동 시킨다.

 

사용 - Handheld.Vibrate();

설명 - 디바이스를 1회 진동시킨다.

-문제-

  • Social.localUser.Authenticate 호출 시 App Crash(튕김) 현상 발생
  • Social.localUser.Authenticate에 보낸 콜백이 호출 되지 않음

-원인-

  • Google Play Games Plugin Setup시 입력한 ClientID가 AndroidManifest.xml에 저장된 ClientID와 동일하지 않을경우 발생
    (AndroidManifest.xml 경로 : ../Assets\GooglePlayGames\Plugins\Android\GooglePlayGamesManifest.plugin/AndroidManifest.xml)
  • 하지만, 확인결과 xml과 동일하게 들어가 있었음
  • Unity Build 시 AndroidManifest.xml병합 설명 : https://docs.unity3d.com/Manual/android-manifest.html

-해결-

  • Unity Android 빌드 시 AndroidManifest.xml 병합 과정에서 개행문자 오류로 인해 ClientID부분을 잘못 인식 하고 있었음
  • xml ClientID에 '\u003'문자 추가 후 해결
  • <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="\ 232323232323" />
    -> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="\u003232323232323" />
  • 참고자료 : https://github.com/playgameservices/play-games-plugin-for-unity/issues/2013


// 0.0 >= t <= 1.0 her be magic and dragons  
    public Vector3 GetPointAtTime(float t)
    {
        float u = 1f - t;
        float tt = t * t;
        float uu = u * u;
        float uuu = uu * u;
        float ttt = tt * t;

        Vector3 p = uuu * this.points[0].position; //first term  
        p += 3 * uu * t * this.points[1].position; //second term  
        p += 3 * u * tt * this.points[2].position; //third term  
        p += ttt * this.points[3].position; //fourth term  

        return p;
    }
t : 시간
point[0] : 시작지점
point[1] : 조절 지점 1
point[2] : 조절 지점 2
point[3] : 도착 지점

 

Semaphore and Monitor


  • Semaphore의 문제점 보완
    - 함수명으로 Semaphore의 사용을 구분한다.


  • Mutex (Mutual exclusion)
    - Mutual exclusion을 구현하기 위해 사용하는 Sleeping Lock
    - 동일한 Mutex를 사용할 때 Mutex_lock()을 호출한 Process와 Mutex_unlock()을 호출한 Process가 일치해야 된다.

  • Semaphore의 구현
    - 기본적으로 C 구조체 이다.


  • P함수 / V함수 구현
    - Interrupt disable을 사용해야 안전성이 보장된다.
    - 짧은 시간이기 때문에 Interrupt disable을 사용해도 문제가 없다.
    - Cnt = Semaphore
    - Cnt가 0이상일 경우 : 남아있는 열쇠(자원)의 개수
    - Cnt가 0이하일 경우 : 절대값이 Queue에서 대기중인 Process의 개수
    - 기본적으로 Single Processor용 Mechanism


  • Multi Processor Semaphore Mechanism
    - Atomic OS 필요 : 글로벌 자원를 읽고, 쓰는 등 전체의 과정을 쪼갤 수 없는 기본 단위로 만듦
    - Bus를 장악하여 한 Processor가 자원을 사용하고 있을 경우 다른 Processor의 Bus Transaction을 차단

  • TAS (Test And Set) Instruction
    - 대표적인 Multi Processor Semaphore Mechanism
    - 메모리의 Boolean 변수를 읽어서 확인 후 값을 1로 쓰는 작업을 Atomic하게 수행
    - Busy waiting이란 단점이 있다.
        *Busy Waiting(Spining) : 특정 조건의 만족 여보를 루프를 돌면서 반복하여 확인하는 기법

  • Monitor
    - P나 V를 빼먹어서 생기는 오류를 최대한 줄이기 위해 사용
    - Java에서 Synchronized Class가 예


  • Monitor API
    - condition 변수 : 어떤 조건이 충족되기를 기다리고 있는 Process들의 Waiting Queue
    - Monitor는 한번에 하나의 Process만 내부의 Method를 수행할 수 있도록 허용하기 때문에 Monitor 내부의 변수들을 따로 보호하지 않는다.



  • Hoare Style Monitor(Signal-and-Urgent-wait monitor)
    - waitQueue에서 깨어난 Process가 바로 monitor내부로 진입하는 방식의 Monitor
        *Signaler Queue : Signal을 보낸 Process가 Monitor밖에서 대기하기 위한 Queue

  • Brinch-Hansen Style Monitor
    - Wait Queue에 Signal을 보낸 Process가 수행을 계속하는 방식의 Monitor

  • Monitor Implementation



'프로그래밍 > 운영체제' 카테고리의 다른 글

Process Synchronization  (0) 2016.10.20
CPU Scheduling  (0) 2016.10.15
MultiThreading  (0) 2016.10.13
Context Switching(2)  (0) 2016.10.11
Context Switching(1)  (0) 2016.10.11

+ Recent posts