单机问题解决了,接下来是动态src的问题,之前有看到过有解决方案的。
今天参考了:Unity动态改变src的解决方法 - 智周万物
我的目的是实现可以打开任意.unity3d文件的功能,把他的代码整理了一下,能删的删,做成了一个用户控件,代码:
public partial class U3DPlayer : UserControl
{
public static U3DPlayer AppendTo(Control parent, string path)
{
try
{
U3DPlayer player = new U3DPlayer(path);
parent.Controls.Clear();
parent.Controls.Add(player);
return player;
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
}
public U3DPlayer(string path)
{
InitializeComponent();
_u3DPlayer = InitU3DPlayer();
OpenFile(path);
}
private AxUnityWebPlayer _u3DPlayer;
private void OpenFile(string path)
{
_u3DPlayer = CreateU3DPlayerEx(path, _u3DPlayer);
}
private AxUnityWebPlayer InitU3DPlayer()
{
var resources = new ComponentResourceManager(GetType());
AxHost.State state1 = ((AxHost.State)(resources.GetObject("u3dPlayer.OcxState")));
var player = CreateU3DPlayer(state1);
return player;
}
private AxUnityWebPlayer CreateU3DPlayerEx(string path, AxUnityWebPlayer player)
{
var state = GetState(path, player);
return CreateU3DPlayer(state);
}
/*
* 给unity设置src属性时,会自动生成字符串资源,并把它赋值给属性OcxState。
* 由于没办法手动生成这个字符串,因而需要通过代码,即先赋值给OcxState,再取出来的方式得到需要的字符串资源。
* 然后再将值赋给重新创建的控件。
*/
/// <summary>
/// 获取需要的字符串资源
/// </summary>
/// <param name="path"></param>
/// <param name="player"></param>
/// <returns></returns>
private static AxHost.State GetState(string path, AxUnityWebPlayer player)
{
player.src = new FileInfo(path).FullName; //这里是重点
AxHost.State state = player.OcxState;
player.Dispose();//因为之后马上就要创建新的了
return state;
}
private AxUnityWebPlayer CreateU3DPlayer(AxHost.State state1)
{
var player = new AxUnityWebPlayer() { Dock = DockStyle.Fill };
((ISupportInitialize)(player)).BeginInit();
player.OcxState = state1;
Controls.Add(player);
((ISupportInitialize)(player)).EndInit();
return player;
}
}
最后,那个OpenFile是无法改成public的,应该说是,能改,前面两次调用也没问题,但是,第三次开始就会出异常关闭程序(具体原因我也没去深究)。所以使用时就一个U3DPlayer显示一个场景,要换的话,再创建一个就好了。也就是一开始的AppendTo方法。实际上我是有点想把构造函数直接改成private的,但是已经有些地方用了,还是算了。
U3DPlayer UnityWebPlayer动态改变src
原文地址:http://blog.csdn.net/llhswwha/article/details/42783353