Unity

Unity - iOS 프레임워크와 통신

Dean83 2022. 3. 24. 22:57

1. Object-C
    1. 1. Unity 스크립트에서 호출시
            - DllImport를 활용하여야 함. 콜백함수 등록을 위해선 static이어야 하며, MonoPInvokeCallback 설정해야함
            - using 문에 using AOT; 를 추가해야함

using AOT;
....

public delegate void TestDelegate(string result);
    [MonoPInvokeCallback(typeof(TestDelegate))]
    public static void _TestCallback(string result)
    {
        Debug.Log("TestCallback : " + result);
    }

    [DllImport("__Internal")]
    private static extern void _CommTest(TestDelegate callback);

    public void OnClickTest()
    {
        _CommTest(_TestCallback);
    }

     1. 2. Object-C 코드
             - extern "C" 를 해야함.

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

typedef void (*TestDelegate)(const char *result);

extern "C"
{
	void _CommTest(TestDelegate delTest)
	{
		delTest([@"dd" UTF8String]);
	}
}


2. Swift
    - Object-C와 Swift간 연결을 위한 Bridge가 필요하다.
    - Unity는 Object-C와 통신하고, Object-C에서 swift로 호출하여 처리한다.
    - 참조 : https://medium.com/sunriv/%EC%9C%A0%EB%8B%88%ED%8B%B0%EC%9A%A9-plugin-%EB%A7%8C%EB%93%A4%EA%B8%B0-ios%ED%8E%B8-swift-de97c8449012
    - 참조 : https://garlicdipping.github.io/archivers/writing-unity-ios-native-swift-plugin

    - Xcode 실행 -> 상단 메뉴 File ->  Create -> workspace 생성
    - XCode -> 상단 메뉴 File -> Create -> project 생성 (총 2개 생성 해야함)
       - Framework 선택 -> 언어는 Objective-C 선택 -> 위에 생성한 workspack에 속하도록 설정 후 확인
       - 위와 동일하나, 언어가 Swift 로 설정
    
    2. 1. Swift 프로젝트
            - swift 파일 추가 하여 클래스 및 함수 추가
            - 클래스 선언부 맨 앞, 함수 선언부 맨 앞에 @objc 입력
            - Object C에서 쓰기 위해 빌드 하여야 함. (타겟 디바이스는 실제 타겟디바이스로)
 

//예 : 
@objc public class TestClass : NSObject
{
     static let Shared = TestClass()

     @objc public func TestFunc() -> String
     {
         return "test"
     }

     @objc public static func SharedInstance() -> TestClass 
      {
         return Shared;
      }
     
}

    2. 2. Objectvive-C 프로젝트
            - 
c++ 파일 생성 -> 파일확장자를 mm 으로 수정
            - 1. 2. 를 참조하여 Unity와 연결 할 수 있는 코드 생성
            - 프로젝트 세팅 -> General -> Frameworks and Libraries 에 +를 눌러 위 2. 1. 에서 빌드한 swift framework를 추가
            - 다음의 include 코드 추가

#include "swift 프로젝트명/swift 프로젝트명-Swift.h"

            - 다음의 코드로 Swift 함수를 호출
 

[[swift클래스명 GetInstance]호출 함수명];

//오류 표시시, swift 프로젝트 빌드, obj-c 프로젝트 빌드 하여 갱신을 해볼것

    2. 3. Swift의 클로저 (c#대리자) 를 objective-c에서 호출하기
            - 
Swift 대부분의 함수 혹은 카카오 로그인 같은 경우 동작 완료후 클로저를 호출하여 후속 동작을 함.
            - Swift에서 objective-c 코드 호출을 구현하기 까다로울 수 있으므로, objective-c에서 swift함수 호출시
              Swift 함수에 클로저 인자를 받아, 작업 종료 후 objective-c 에서 이어 나가도록 함. 
 

//swift 함수예제

//token인 string을 인자값으로 받고, completion이 클로저임. String을 전달하는 클로저
@objc public func TestFunc(_token:String, completion:@escaping(String)->void)
{
   ...
}


//objective-c 호출 예제
[[클래스명 인스턴스명]TestFunc :[NSString stringWithUTF8String:문자열] completion: ^(NSString * result)
{
   ....
}];

Objective-c 에서 호출하는 함수명인 TestFunc 는 함수명이 변경 될 수도 있다.
#include 프로젝트명/프로젝트명-Swift.h 파일을 열어 하단의 실제 정의된 함수명으로 호출해야 한다.

 

3. Unity에 추가
    - Obj C와 swift 프로젝트 모두 빌드하여 오류 없는지 확인. 
    - 오류가 없는경우, swift 프로젝트의 결과물인 xxx.framework 와 obj c 프로젝트 폴더 전체를 복사
    - Unity -> Assets -> PlugIns -> IOS 에 붙여넣기 진행
    - Unity 에서 IOS 빌드 후 나온 XCode 프로젝트를 열어 오류가 나는 부분 수정
       (2. 2. 에서 추가한 h 파일을 찾지 못한다는 오류 발생시, 해당 헤더파일을 복사하여 오류가 발생하는 파일 폴더에 붙여넣기)

'Unity' 카테고리의 다른 글

나이언틱 라이트쉽 관련 (AR)  (0) 2022.03.24
Unity 에서 Android Push Notification 구현  (0) 2022.03.24
마이크 wav 파일 녹음 모듈  (0) 2022.03.24
소셜 로그인 연동  (0) 2022.03.24
mp3 -> wav 변환  (0) 2022.03.24