U3DPlayer UnityWebPlayer动态改变src

来源:互联网 发布:如何设置手机淘宝密码 编辑:程序博客网 时间:2024/06/05 23:36

单机问题解决了,接下来是动态src的问题,之前有看到过有解决方案的。

今天参考了:Unity动态改变src的解决方法 智周万物

 我的目的是实现可以打开任意.unity3d文件的功能,把他的代码整理了一下,能删的删,做成了一个用户控件。

不知道为什么我的是AxUnityWebPlayer ,他的是U3DPlayer,难道他已经封装了一层?反正直接用AxUnityWebPlayer代进去能用。

代码:

 

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的,但是已经有些地方用了,还是算了。

0 0
原创粉丝点击