Unity(iOS) 프로젝트의 네이티브 소스에서 리소스를 로드하는 방법

15121 단어 iOSSwiftSwift4Unity

소개



Unity 프로젝트에서 iOS 네이티브 소스에서 이미지와 같은 리소스를 로드하는 방법을 소개합니다.

여기서 소개하는 방법은 방법이 잘 생겼는지는 모르지만 우선 실현은 할 수 있었다는 방법입니다. (Unity 초보자이므로 더 좋은 방법이 있으면 가르쳐주세요)

하고 싶은 일


  • iOS 빌드하여 iOS 네이티브 소스에서 이미지와 같은 리소스를로드합니다.

    방법 1 (직접 Images.xcassets에 넣기)



    방법


  • Unity 프로젝트의 iOS 빌드하기
  • 생성 된 Xcode 프로젝트의 Images.xcassets에 이미지 넣기
  • 네이티브 소스로 이미지로드



  • 이미지 로드. 이번에는 DataSet이 좋았기 때문에 DataSet으로 취급하고 있습니다.
    if let data = NSDataAsset(name: "hogehoge")?.data {
        let image = UIImage(data: data)
    }
    

    이것이 가장 간단하다고 생각합니다만, 매회 빌드 후에 화상을 넣지 않으면 안되기 때문에 수고가 걸립니다.

    방법 2 (Documents 폴더에서 공유)



    방법


  • Unity 프로젝트의 Assets/Resources 폴더에 이미지를 넣습니다
  • Unity 측의 Documents 폴더에 이미지 저장
  • 네이티브 소스로 Documents 폴더에 저장된 이미지 가져 오기

  • Unity 측
    Texture2D tex2d = Resources.Load("hogehoge") as Texture2D;
    File.WriteAllBytes(Application.persistentDataPath+"/hogehoge.png",tex2d.EncodeToPNG());
    

    네이티브 측
    let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let imagePath = "\(documentPath)/hogehoge.png"
    if let data = FileManager.default.contents(atPath: imagePath) {
        let image = UIImage(data: data)
    }
    

    낭비적으로 문서 아래에 파일을 넣는 것은 어떨까요 ...

    방법 3 (스크립트에서 Images.xcassets에 넣기)



    방법


  • 적절한 Xcode 프로젝트의 xcassets에 이미지를 넣어 dataset을 만듭니다
  • Unity 프로젝트의 Assets/Plugins/iOS 폴더에 만든 dataset을 넣는다
  • Unity 프로젝트의 Assets/Plugins/iOS/Editor 폴더에 스크립트를 넣습니다.
  • 네이티브 소스로 이미지로드
  • Unity 프로젝트의 iOS 빌드하기

  • 아래의 hogehoge.dataset을 Unity 프로젝트에 추가.



    스크립트는 여기 를 참고.

    아래 스크립트를 Unity 프로젝트에 넣는다 (Editor 폴더 아래라면 어디서나 좋은 것 같습니다)
    using System.IO;
    using UnityEngine;
    using UnityEditor;
    using UnityEditor.Callbacks;
    
    public class XcodeSettingsPostProcesser
    {
      [PostProcessBuildAttribute (0)]
      public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
      {
        if(target != BuildTarget.iPhone) return;
    
        CopyImages(pathToBuiltProject);
      }
    
      //Assets/Plugins/iOS配下の.datasetフォルダをXcodeプロジェクトのImages.xcassetsにコピーする
      private static void CopyImages(string xcodeProjectPath)
      {
        var destDirName = Path.Combine(xcodeProjectPath, "Unity-iPhone/Images.xcassets/");
        var path = Application.dataPath + "/Plugins/iOS"
        var sourceDirNames = Directory.GetDirectories(path, "*.dataset", SearchOption.AllDirectories);
        foreach(var sourceDirName in sourceDirNames)
        {
          var dirName = Path.GetFileName(sourceDirName);
          CopyDirectory(sourceDirName, Path.Combine(destDirName, dirName));
        }
      }
    
      public static void CopyDirectory(string sourceDirName, string destDirName)
      {
        //コピー先のディレクトリがないときは作る
        if (!System.IO.Directory.Exists(destDirName))
        {
          System.IO.Directory.CreateDirectory(destDirName);
          //属性もコピー
          System.IO.File.SetAttributes(destDirName,
              System.IO.File.GetAttributes(sourceDirName));
        }
    
        //コピー先のディレクトリ名の末尾に"\"をつける
        if (destDirName[destDirName.Length - 1] !=
            System.IO.Path.DirectorySeparatorChar)
          destDirName = destDirName + System.IO.Path.DirectorySeparatorChar;
    
        //コピー元のディレクトリにあるファイルをコピー
        string[] files = System.IO.Directory.GetFiles(sourceDirName);
        foreach (string file in files)
        {
          if(file.EndsWith(".meta")) continue; // metaファイルはコピーしない.
          System.IO.File.Copy(file, destDirName + System.IO.Path.GetFileName(file), true);
        }
    
        //コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す
        string[] dirs = System.IO.Directory.GetDirectories(sourceDirName);
        foreach (string dir in dirs)
          CopyDirectory(dir, destDirName + System.IO.Path.GetFileName(dir));
      }
    }
    

    iOS 빌드 후 아래와 같이 이미지가 추가되었습니다.



    이미지 로드
    if let data = NSDataAsset(name: "hogehoge")?.data {
        let image = UIImage(data: data)
    }
    

    방법 1의 Xcode에 이미지를 넣는 것을 자동화한 것이 이 방법. 3가지 중에서는 이 방법이 좋을까라고 생각합니다.

    사이고에게



    이미지만 보기만 해도 상당히 고생했는데...

    네이티브 측에서 엉망이 되려고 생각하면 여러가지 궁리가 있는 것 같습니다.

    참고



    Unity iOS에서 자동으로 이미지 리소스 추가

    좋은 웹페이지 즐겨찾기