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 |