winform 封装unity web player 用户控件

这篇具有很好参考价值的文章主要介绍了winform 封装unity web player 用户控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境:

  • VS2015
  • Unity 5.3.6f1 (64-bit)

目的:

Unity官方提供的UnityWebPlayer控件在嵌入Winform时要求读取的.unity3d文件路径(Src)必须是绝对路径,如果移动代码到另一台电脑,需要重新修改src。于是考虑使用winform用户控件来进行封装,以实现读取存放在工程文件夹下的.unity3d文件的效果。

参考:

  • WinForm内嵌Unity3D_winform嵌入unity3d并交互__学而时习之_的博客-CSDN博客

  • https://www.cnblogs.com/xieyulin/p/7050618.html

过程

首先新建windows用户窗体库

winform 封装unity web player 用户控件,unity,前端,游戏引擎


然后在空白控件上添加UnityWebPlayer,这一步是为了添加Interop.UnityWebPlayerAXLib.dll、AxInterop.UnityWebPlayerAXLib.dll两个引用。

winform 封装unity web player 用户控件,unity,前端,游戏引擎


当引用列表里出现这两个引用时,把刚才添加的UnityWebPlayer控件删除。

winform 封装unity web player 用户控件,unity,前端,游戏引擎


然后修改控件的.cs文件,代码如下

//U3DPlayer.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UnityPlayer
{
    public partial class U3Dplayer: UserControl
    {
       
        #region 自定义事件
        //委托
        public delegate void ExternalCallHandler(object sender, AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEvent e);
        /// <summary>
        /// 接收Unity调用宿主函数的消息
        /// </summary>
        [Browsable(true), Description("接收Unity调用宿主(如WinForm)函数的消息")]
        public event ExternalCallHandler UnityCall;
        //方法
        public void OnUnityCall(object sender, AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEvent e)
        {
            if (UnityCall != null)
            {
                UnityCall(sender, e);
            }
        }
        #endregion

        #region 内部变量
        private AxUnityWebPlayerAXLib.AxUnityWebPlayer _axUnityWebPlayer = null;
        #endregion

        /// <summary>
        /// 用户控件函数
        /// </summary>
        public U3Dplayer()
        {
            InitializeComponent();

            string src = Application.StartupPath + "\\unity.unity3d";//在这里设置路径

            _axUnityWebPlayer = CreateUnity(this, src);
            OnExternalCallCheck();
            this.Controls.Add(_axUnityWebPlayer);//在原控件上添加UnityWebPlayer控件
        }

        /// <summary>
        /// 建立一个新的unity控件并设置一些属性
        /// </summary>
        /// <param name="form"></param>
        /// <param name="src"></param>
        /// <returns></returns>
        public static AxUnityWebPlayerAXLib.AxUnityWebPlayer CreateUnity(Control form, string src)
        {
            var unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
            ((System.ComponentModel.ISupportInitialize)(unity)).BeginInit();
            form.Controls.Add(unity);
            ((System.ComponentModel.ISupportInitialize)(unity)).EndInit();
            unity.src = src;
            AxHost.State state = unity.OcxState;//最关键的是OcxState,必须使用AxUnityWebPlayer才能依据Src动态产生。
            unity.Dispose();
            unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
            ((System.ComponentModel.ISupportInitialize)(unity)).BeginInit();
            form.SuspendLayout();
            unity.Dock = DockStyle.Fill;
            //unity.Size = new System.Drawing.Size(720, 450);
            unity.Name = "Unity";
            unity.OcxState = state;
            unity.TabIndex = 0;
            //unity.Location = new System.Drawing.Point(0, 0);
            ((System.ComponentModel.ISupportInitialize)(unity)).EndInit();
            form.ResumeLayout(false);
            return unity;
        }

        private void OnExternalCallCheck()
        {
            if (_axUnityWebPlayer == null)
            {
                throw new Exception("_axUnityWebPlayer init fail");
            }
            else
            {
                _axUnityWebPlayer.OnExternalCall += _axUnityWebPlayer_OnExternalCall;
            }
        }

        void _axUnityWebPlayer_OnExternalCall(object sender, AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEvent e)
        {
            if (e.value.StartsWith("LOAD_COMPLETE"))
            {
                if (!_axUnityWebPlayer.Visible)
                {
                    _axUnityWebPlayer.Width = this.Width;
                    _axUnityWebPlayer.Height = this.Height;
                    _axUnityWebPlayer.Show();
                }
            }
            OnUnityCall(sender, e);
        }
      

        #region SendMessage
        /// <summary>
        /// 发送消息给Unity
        /// </summary>
        /// <param name="unityObjName">Unity中的对象名称</param>
        /// <param name="unityScriptyMethod">Unity脚本中的方法</param>
        /// <param name="val">传送的值.仅限于int、float、string</param>
        public void SendMessage(string unityObjName, string unityScriptyMethod, object val)
        {
            if (_axUnityWebPlayer == null)
            {
                return;
            }
            _axUnityWebPlayer.SendMessage(unityObjName, unityScriptyMethod, val);
        }
        #endregion
    }
}

然后选择生成动态链接库。

winform 封装unity web player 用户控件,unity,前端,游戏引擎


在Winform工程中选择“工具”–“选择工具箱项”–导入,即可使用

winform 封装unity web player 用户控件,unity,前端,游戏引擎

winform 封装unity web player 用户控件,unity,前端,游戏引擎

转 :Winform基于UnityWebplayer封装用户控件以实现.unity3d文件相对路径(动态src) - 灰信网(软件开发博客聚合)文章来源地址https://www.toymoban.com/news/detail-657797.html

到了这里,关于winform 封装unity web player 用户控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity之IMGUI脚本封装】—编译模式下控件可视化及其封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 此图可忽略 UML类图 性能优化代码 完整代码: 按钮封装代

    2024年02月15日
    浏览(61)
  • 【Unity之IMGUI脚本封装】—自定义常用控件的封装(即拿即用)

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 UML类图 封装代码: 按钮封装代码 封装代码 UML类图 封装代码 封装代码 封装代码 GUI.DrawTextrrue 没有自定义样式的重载 封装代

    2024年02月16日
    浏览(45)
  • Unity 转微信小游戏Error building Player: Incompatible color space with graphics API

    Unity 开发 微信小游戏,进行转换小游戏时报Error building Player: Incompatible color space with graphics AP错误,主要原因是不兼容WEBGL2.0。 需要在 Unity Editor中File-Build settings-Player Settings中设置Color space为Gamma。默认值是Linear这需要WebGL2.0支持。 勾选选项WebGL2.0(Beta)选项。也可解决上述问题

    2024年02月14日
    浏览(41)
  • 【Unity之IMGUI脚本封装】—位置信息类和控件基类的封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 作用:让控件根据调整对齐 最终代码 特点: 类是抽象类:原因基类

    2024年02月17日
    浏览(41)
  • 【Unity之IMGUI】—编译模式下控件可视化及其封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 此图可忽略 UML类图 性能优化代码 完整代码: 按钮封装代

    2024年02月10日
    浏览(42)
  • 【Unity之IMGUI】—自定义常用控件的封装(即拿即用)

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 UML类图 封装代码: 按钮封装代码 封装代码 UML类图 封装代码 封装代码 封装代码 GUI.DrawTextrrue 没有自定义样式的重载 封装代

    2024年02月11日
    浏览(42)
  • 【Unity之IMGUI】—位置信息类和控件基类的封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 作用:让控件根据调整对齐 最终代码 特点: 类是抽象类:原因基类

    2024年02月12日
    浏览(41)
  • 【unity之IMGUI实践】游戏结束流程封装实现【七】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.坐标三个转化 2.GUI的原点和屏幕的原点 3.结构体的特点回顾——涉及Rect_结构体类型 4.血条的

    2024年02月14日
    浏览(46)
  • 【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.坐标三个转化 2.GUI的原点和屏幕的原点 3.结构体的特点回顾——涉及Rect_结构体类型 4.血条的

    2024年02月11日
    浏览(66)
  • 【Unity3D游戏魔坦之争】敌方逻辑封装实现【六】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.炮台的行为逻辑封装:旋转,触发检测,发射炮弹及特效 2.检测玩家后自动瞄准攻击 3.玩家扣

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包