public void Create(Types.AssetCreationInfo info) { m_handle = Types.INVALID_HANDLE; if (!HvrHelper.Support.IsApplicationStateSupported()) { return; } try { UnityInterface.Lock(); if (HvrPlayerInterface.Initialise()) { m_assetCreationInfo = info; m_assetCreationInfo.structSize = (uint)Marshal.SizeOf(typeof(Types.AssetCreationInfo)); GCHandle assetHandle = GCHandle.Alloc(this); IntPtr assetPtr = (IntPtr)assetHandle; m_assetCreationInfo.userData = assetPtr; // https://answers.unity.com/questions/1229036/callbacks-from-c-to-c-are-not-working-in-540f3.html?sort=votes // For both IL2CPP and Mono on an AOT platform (like iOS) it is not possible to marshal an instance method to a function pointer // that can be called from native code. Only static methods in C# code be called from native code like this. m_assetCreationInfo.onInitialized = Callbacks.OnAssetInitialised; m_assetCreationInfo.onRepresentationDataRecieved = Callbacks.OnAssetRepresentationDataReceived; m_assetCreationInfo.onSelectRepresentation = Callbacks.OnAssetSelectRepresentation; m_handle = HvrPlayerInterfaceAPI.Asset_CreateFromInfo(ref m_assetCreationInfo); if (m_assetCreationInfo.assetPath.StartsWith("tcp")) { m_assetType = AssetSource.RealTime; } else if (m_assetCreationInfo.assetPath.EndsWith("8imanifest")) { m_assetType = AssetSource.VOD; } else { m_assetType = AssetSource.Local; } #if VERBOSE_LOGGING Debug.Log("Create " + GetType().Name + " Handle:" + handle); #endif UnityInterface.SceneObjectsAdd(handle, GetType().Name + handle, GetType().FullName); } } catch (Exception e) { Debug.LogError(e.Message); } finally { UnityInterface.Unlock(); } }