同步C++;(.dll)使用C#Unity脚本

同步C++;(.dll)使用C#Unity脚本,c#,c++,unity3d,dll,C#,C++,Unity3d,Dll,我正在尝试将本机代码(c++项目)作为.dll与c#unity脚本同步。 本机代码: 音频.h: #pragma once #include <iostream> #define EXPORT __declspec(dllexport) extern "C" { EXPORT void initialize(std::string soundFilePaths[]); EXPORT void setSourcePosition(std::string sou

我正在尝试将本机代码(c++项目)作为.dll与c#unity脚本同步。 本机代码:

音频.h:

#pragma once
#include <iostream>
#define EXPORT __declspec(dllexport)

extern "C" {    
    EXPORT void initialize(std::string soundFilePaths[]);
    EXPORT void setSourcePosition(std::string soundFilePath, float x, float y, float z);
    EXPORT void play();
    EXPORT void stop();
    EXPORT void setListenerRotation(float x, float y, float z);
}

class Audio {

public:

    static Audio& instance() {  // Singleton
        static Audio INSTANCE;
        return INSTANCE;
    }

    void initialize(std::string soundFilePaths[]);
    void setSourcePosition(std::string soundFilePath, float x, float y, float z);
    void play();
    void stop();
    void setListenerRotation(float x, float y, float z);
    ~Audio();

private:    
    Audio();
};
Unity C#脚本如下所示:

using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class AudioPlugin : MonoBehaviour
{
    public AudioContainer[] audioContainers;
    //public AudioClip[] audioFiles;
    //public Transform[] audioSources;
    public Transform headGeometry;
    public float rotationSpeed = 50;
    public float maxYRotation = 90;
    public float minYRotation = -90;
    float _currentYRotation;

    void Start()
    {
        _currentYRotation = headGeometry.transform.rotation.eulerAngles.y;
        string[] filePaths = GetAllFilePathsFromClips();
        AudioPluginConnection.Initialize(filePaths);
        AudioPluginConnection.Play();
    }

    void Update()
    {
        TurnHeadWithInput();
        UpdateListenerRotation();
        UpdateSoundPositions();
    }

    void OnDestroy()
    {
        AudioPluginConnection.Stop();
    }

    void TurnHeadWithInput()
    {
        float horizontal = Input.GetAxis("Horizontal");
        horizontal *= Time.deltaTime * rotationSpeed;
        _currentYRotation = Mathf.Clamp(_currentYRotation + horizontal, minYRotation, maxYRotation);
        Vector3 eulerAngles = headGeometry.rotation.eulerAngles;
        eulerAngles.y = _currentYRotation;
        headGeometry.rotation = Quaternion.Euler(eulerAngles);
    }

    void UpdateListenerRotation()
    {
        Vector3 eulerAngles = headGeometry.rotation.eulerAngles;
        AudioPluginConnection.SetListenerRotation(eulerAngles.x, eulerAngles.y, eulerAngles.y);
    }

    void UpdateSoundPositions()
    {
        foreach (AudioContainer container in audioContainers)
        {
            Vector3 position = container.source.position;
            AudioPluginConnection.SetSourcePosition(container.filePath, position.x, position.y, position.z);
        }
    }

    string[] GetAllFilePathsFromClips()
    {
        List<string> audioFilePaths = new List<string>();
        foreach (AudioContainer container in audioContainers)
        {
            audioFilePaths.Add(container.filePath);
        }
        return audioFilePaths.ToArray();
    }
}

[System.Serializable]
public class AudioContainer
{
    public AudioClip clip;
    public Transform source;
    public string filePath { get { return Application.dataPath + "/Audio/" + clip.name + ".wav"; } }
}

public class AudioPluginConnection
{
    [DllImport("AudioPlugin", EntryPoint = "test")]
    public static extern int Test();
    [DllImport("AudioPlugin", EntryPoint = "initialize")]
    public static extern void Initialize(string[] soundFilePaths);
    [DllImport("AudioPlugin", EntryPoint = "setSourcePosition")]
    public static extern void SetSourcePosition(string soundFilePath, float x, float y, float z);
    [DllImport("AudioPlugin", EntryPoint = "play")]
    public static extern void Play();
    [DllImport("AudioPlugin", EntryPoint = "stop")]
    public static extern void Stop();
    [DllImport("AudioPlugin", EntryPoint = "setListenerRotation")]
    public static extern void SetListenerRotation(float x, float y, float z);
}
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
使用UnityEngine;
公共类AudioPlugin:MonoBehavior
{
公共音频容器[]音频容器;
//公共音频剪辑[]音频文件;
//公共音频源;
公共几何;
公共浮球旋转速度=50;
公共浮动最大流量=90;
公共浮点数=-90;
浮子旋转;
void Start()
{
_currentYRotation=headGeometry.transform.rotation.eulerAngles.y;
string[]filepath=GetAllFilePathsFromClips();
AudioPluginConnection.Initialize(文件路径);
AudioPluginConnection.Play();
}
无效更新()
{
带输入的转盘();
UpdateListenerRotation();
UpdateSoundPositions();
}
void OnDestroy()
{
AudioPluginConnection.Stop();
}
void turnhead with input()
{
float horizontal=Input.GetAxis(“水平”);
水平*=时间增量*旋转速度;
_currentyrotion=数学钳位(_currentyrotion+水平、最小、最大);
Vector3 eulerAngles=头部几何体.rotation.eulerAngles;
eulerAngles.y=_currentYRotation;
headGeometry.rotation=四元数.Euler(欧拉格);
}
void UpdateListenerRotation()
{
Vector3 eulerAngles=头部几何体.rotation.eulerAngles;
音频插头连接.设置监听器旋转(eulerAngles.x,eulerAngles.y,eulerAngles.y);
}
void updateoundpositions()
{
foreach(audioContainers中的AudioContainer容器)
{
Vector3位置=container.source.position;
AudioPluginConnection.SetSourcePosition(container.filePath,position.x,position.y,position.z);
}
}
字符串[]GetAllFilePathsFromClips()
{
List audiofilepath=新列表();
foreach(audioContainers中的AudioContainer容器)
{
添加(container.filePath);
}
返回audiofilepath.ToArray();
}
}
[系统可序列化]
公共类音频容器
{
公共音频剪辑;
公共资源;
公共字符串文件路径{get{return Application.dataPath+“/Audio/”+clip.name+“.wav”;}}
}
公共类音频插件连接
{
[DllImport(“AudioPlugin”,EntryPoint=“test”)]
公共静态外部内部测试();
[DllImport(“AudioPlugin”,EntryPoint=“initialize”)]
公共静态外部无效初始化(字符串[]声音文件路径);
[DllImport(“AudioPlugin”,EntryPoint=“setSourcePosition”)]
公共静态外部void SetSourcePosition(字符串soundFilePath、浮点x、浮点y、浮点z);
[DllImport(“AudioPlugin”,EntryPoint=“play”)]
公共静态外部无效播放();
[DllImport(“AudioPlugin”,EntryPoint=“stop”)]
公共静态外部无效停止();
[DllImport(“AudioPlugin”,EntryPoint=“setListenerRotation”)]
公共静态外部void SetListenerRotation(浮点x、浮点y、浮点z);
}
每次我试图运行unity场景,unity程序都会崩溃。我认为问题出在本机代码中,因为我真的不知道如何将类和方法导出到.dll。 我的假设是,可能字符串(我将其用作两个方法的参数)不起作用,因为当我使用字符串返回值创建一个测试方法时,程序也崩溃了。但我不确定

我想知道为什么我的程序会崩溃,以及如何同步这两个代码(c++和c#)


提前感谢您

看一下。您也可以尝试使用c++/cli桥和marshaing lib来实现此目的。看一下。您也可以尝试使用c++/cli桥和marshaing lib来实现此目的。
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class AudioPlugin : MonoBehaviour
{
    public AudioContainer[] audioContainers;
    //public AudioClip[] audioFiles;
    //public Transform[] audioSources;
    public Transform headGeometry;
    public float rotationSpeed = 50;
    public float maxYRotation = 90;
    public float minYRotation = -90;
    float _currentYRotation;

    void Start()
    {
        _currentYRotation = headGeometry.transform.rotation.eulerAngles.y;
        string[] filePaths = GetAllFilePathsFromClips();
        AudioPluginConnection.Initialize(filePaths);
        AudioPluginConnection.Play();
    }

    void Update()
    {
        TurnHeadWithInput();
        UpdateListenerRotation();
        UpdateSoundPositions();
    }

    void OnDestroy()
    {
        AudioPluginConnection.Stop();
    }

    void TurnHeadWithInput()
    {
        float horizontal = Input.GetAxis("Horizontal");
        horizontal *= Time.deltaTime * rotationSpeed;
        _currentYRotation = Mathf.Clamp(_currentYRotation + horizontal, minYRotation, maxYRotation);
        Vector3 eulerAngles = headGeometry.rotation.eulerAngles;
        eulerAngles.y = _currentYRotation;
        headGeometry.rotation = Quaternion.Euler(eulerAngles);
    }

    void UpdateListenerRotation()
    {
        Vector3 eulerAngles = headGeometry.rotation.eulerAngles;
        AudioPluginConnection.SetListenerRotation(eulerAngles.x, eulerAngles.y, eulerAngles.y);
    }

    void UpdateSoundPositions()
    {
        foreach (AudioContainer container in audioContainers)
        {
            Vector3 position = container.source.position;
            AudioPluginConnection.SetSourcePosition(container.filePath, position.x, position.y, position.z);
        }
    }

    string[] GetAllFilePathsFromClips()
    {
        List<string> audioFilePaths = new List<string>();
        foreach (AudioContainer container in audioContainers)
        {
            audioFilePaths.Add(container.filePath);
        }
        return audioFilePaths.ToArray();
    }
}

[System.Serializable]
public class AudioContainer
{
    public AudioClip clip;
    public Transform source;
    public string filePath { get { return Application.dataPath + "/Audio/" + clip.name + ".wav"; } }
}

public class AudioPluginConnection
{
    [DllImport("AudioPlugin", EntryPoint = "test")]
    public static extern int Test();
    [DllImport("AudioPlugin", EntryPoint = "initialize")]
    public static extern void Initialize(string[] soundFilePaths);
    [DllImport("AudioPlugin", EntryPoint = "setSourcePosition")]
    public static extern void SetSourcePosition(string soundFilePath, float x, float y, float z);
    [DllImport("AudioPlugin", EntryPoint = "play")]
    public static extern void Play();
    [DllImport("AudioPlugin", EntryPoint = "stop")]
    public static extern void Stop();
    [DllImport("AudioPlugin", EntryPoint = "setListenerRotation")]
    public static extern void SetListenerRotation(float x, float y, float z);
}