unity3d嵌入到网页开发_unity3d应用嵌入到wpf应用 - CSDN
精华内容
参与话题
  • unity3d网页数据交互

    千次阅读 2013-05-08 01:24:56
    介绍:  1. u3d是一个3D游戏引擎由于和编辑器集成在一起 所以也可以理解为一个制作/开发平台 2. u3d使用javascript C#作为核心脚本语言 来驱动整个游戏引擎  3. 平台可以发布为Exe执行文件或者打包为供...嵌入网页


    介绍: 
    1. u3d是一个3D游戏引擎由于和编辑器集成在一起 所以也可以理解为一个制作/开发平台
    2. u3d使用javascript C#作为核心脚本语言 来驱动整个游戏引擎 
    3. 平台可以发布为Exe执行文件或者打包为供网页调用的一个独立的包文件
    4. u3d制作的工程具有高度的可移植性 可以在ps xbox360 android iphone mac 等系统上运行

    嵌入网页
    1. 实现和Flash插入网页原理完全一致 使用ActiveX控件 嵌入在网页中 所以和Flash一样 需要安装一个播放器插件(<=3M)
                                  


    2. 如果察看页面源代码 则可以看到如下嵌入部分
    <object id="UnityObject" classid="clsid:444785F1-DE89-4295-863A-D46C3A781394"width="600" height="450"codebase="http://webplayer.unity3d.com/download_webplayer/UnityWebPlayer.cab#version=2,0,0,0">
    <param name="src" value="MyDataFile.unity3d" /><embed id="UnityEmbed" src="MyDataFile.unity3d" width="600" height="450"type="application/vnd.unity" pluginspage="http://www.unity3d.com/unity-web-player-2.x" /></object>
    3. 和Flash一样 在浏览器中加载3d场景或者读取时的图标进度条等都能进行自定义 也可以自定义是否激活是用右键菜单

    数据交互


    1. 在unity3d中调用网页js函数
    如我们在html中有脚本函数:

    则在u3d中我们可以写函数来调用js函数如:
    [pre]Application.ExternalCall( "SayHello", "The game says hello!" );[/pre] 
    2. 在unity3d中直接执行一段脚本代码(这也是可行的) 如:
    [pre]Application.ExternalEval([/pre][pre] "if(document.location.host != 'unity3d.com') { document.location='http://unity3d.com'; }"
    绿色部分是一个字符串 也是一段js脚本在u3d可以直接执行一段js脚本

    3. 在js中调用unity3d函数(传递消息等)
    假如在u3d中有一段功能函数(也是用js写的)
    function MyFunction(param : String
    {
    Debug.Log(param);
    }
    则如果需要在js中呼叫这个函数可以这样写:

    <script type="text/javascript" language="javascript">
    <!--function SaySomethingToUnity(
    document.getElementById("UnityContent").SendMessage("MyObject", "MyFunction", "Hello from a web page!");
    -->
    </script>

    唯一要注意的是MyObject代表u3d中的一个物体名称为MyObject ,MyFunction是赋予给这个问题的函数,最后一个字符为传递的参数。如此可以实现调用和数据传递。


    与php,jsp?等的表单数据交互
    这应该是今后会可能用到的主要方式 原理是利用form表单传递数据 php中已经使用过多次 没有问题 jsp中应该同理

    以php为例
    U3d可以用向某个指定页面发送表单数据然后在php中使用_POST获取传递过来的表单数据
    比如我们有一个网页: www.dreamloader.net/index.php
    其页面源文件如下: 
    <?php
    $action=$_POST["myform_action"];//定义一个变量$action用来获取页面传递过来的表单数据
    if ($action!=””){echo$action;}//如果接受到了数据则打印出数据内容
    ?>

    在unity3d中我们发送数据的代码如下:
    varform = newWWWForm();//定义一个网页表单form.AddField( "myform_action", "Action1" );//添加一个表单字段名称为myform_action内容是Action1
    vardownload = newWWW( “www.dreamloader.net/index.php”, form );//发送表单数据到指定网址页面


    假如index.php中执行的是数据库/统计操作 我们就可以对传递的数据进行保存读取或者其他操作了

    展开全文
  • Unity3d_项目_嵌入网页(一)

    热门讨论 2020-07-21 10:00:36
    共三份。这是第一份。 Unity3d_项目_嵌入网页插件 Unity3d_项目_嵌入网页插件
  • [Unity3D]Unity3D游戏开发之在Android视图中嵌入Unity视图

    万次阅读 多人点赞 2014-10-02 09:53:48
    最近博主发现博主的文章被很多的网站(如游戏蛮牛)等非法转载,在转载的过程中博主原来的文章出处和链接均被去掉,更让博主觉得生气的事情是某些人将博主的文章复制一部分以原创文章的形式发表在CSDN上,这样CSDN在...

          ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei

       转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/39380717

         ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       

       大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。最近博主发现博主的文章被很多的网站(如游戏蛮牛)等非法转载,在转载的过程中博主原来的文章出处和链接均被去掉,更让博主觉得生气的事情是某些人将博主的文章复制一部分以原创文章的形式发表在CSDN上,这样CSDN在根据Tag推荐相关文章的时候,就会将一部分文章连接到博主博客以外的地方,博主并不是一个小气的人,只是这些博客都是倾注了博主自己心血而写成的,如此作践难免让博主本人心寒。从今天起,博主所有的文章、配图都会加上链接,希望以此告诫那些非法转载博主文章的人懂得自重、懂得尊重博主的劳动成果。

       好了,这些人我暂且不去理会,今天我们继续来研究Unity在Android平台上的扩展,通过昨天的学习,大家已经知道Unity和Android是可以互相调用的,可是相信大家从昨天的文章中可以看出,如果单纯地从调用Android接口的角度来看,我们已经可以实现这一目的。可是从实际开发的角度来看,我们只是迈出了很小的一步。为什么这么说呢,因为在实际的开发中可能我们不仅需要从接口上实现与Unity的对接,而且需要从界面上实现与Unity的对接。比如,现在主流的网游都会在游戏开始的时候给玩家一个选择创建角色的过程,通常界面上会显示各种类型的角色设定,玩家可以通过界面了解每种类型的角色的特点,从而选择合适自己的角色。从技术上来讲,这一部分我们可以完全使用Unity3D的GUI系统来实现,不过本文的目的在于探讨Unity和Android的对接问题,因此我们可以假定Android在整个对接过程中扮演着界面渲染的角色,而Unity则负责游戏逻辑的维护。那么,这样就诞生了我们今天的问题,能不能将Unity作为Android界面的一部分嵌入到Android应用中呢?答案当然是肯定的。


        一、为Unity编写Android插件

        首先,我们来看Unity中为Android提供的类文件UnityPlayerNativeActivity.java,该文件位于如下位置:

     D:\ProgramFiles\Unity\Editor\Data\PlaybackEngines\androidplayer\com\unity3d\player(在不同的计算机上可能会有所不同,大家灵活运用即可)

    package com.unity3d.player;
    
    import android.app.NativeActivity;
    import android.content.res.Configuration;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    
    public class UnityPlayerNativeActivity extends NativeActivity
    {
    	protected UnityPlayer mUnityPlayer;		// don't change the name of this variable; referenced from native code
    
    	// Setup activity layout
    	@Override protected void onCreate (Bundle savedInstanceState)
    	{
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		super.onCreate(savedInstanceState);
    
    		getWindow().takeSurface(null);
    		setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
    		getWindow().setFormat(PixelFormat.RGB_565);
    
    		mUnityPlayer = new UnityPlayer(this);
    		if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
    			getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
    			                       WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    		setContentView(mUnityPlayer);
    		mUnityPlayer.requestFocus();
    	}
    
    	// Quit Unity
    	@Override protected void onDestroy ()
    	{
    		mUnityPlayer.quit();
    		super.onDestroy();
    	}
    
    	// Pause Unity
    	@Override protected void onPause()
    	{
    		super.onPause();
    		mUnityPlayer.pause();
    	}
    
    	// Resume Unity
    	@Override protected void onResume()
    	{
    		super.onResume();
    		mUnityPlayer.resume();
    	}
    
    	// This ensures the layout will be correct.
    	@Override public void onConfigurationChanged(Configuration newConfig)
    	{
    		super.onConfigurationChanged(newConfig);
    		mUnityPlayer.configurationChanged(newConfig);
    	}
    
    	// Notify Unity of the focus change.
    	@Override public void onWindowFocusChanged(boolean hasFocus)
    	{
    		super.onWindowFocusChanged(hasFocus);
    		mUnityPlayer.windowFocusChanged(hasFocus);
    	}
    
    	// For some reason the multiple keyevent type is not supported by the ndk.
    	// Force event injection by overriding dispatchKeyEvent().
    	@Override public boolean dispatchKeyEvent(KeyEvent event)
    	{
    		if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
    			return mUnityPlayer.injectEvent(event);
    		return super.dispatchKeyEvent(event);
    	}
    
    	// Pass any events not handled by (unfocused) views straight to UnityPlayer
    	@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
    	@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
    	@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
    	/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
    }
    
    熟悉Android开发的朋友一定对这个类觉得眼熟吧,NativeActivity是Google在Android3.0后推出的,其目的是为了让开发者使用C/C++在NDK环境下管理Activity的生存周期,于是我们可以大胆的猜测Unity之所以可以和Android进行交互是因为NDK提供了方便之门,果然,博主在Unity的目录下找到了
    libmain.so、libunity.so、libmono.so这三个文件,这证实我们的猜想是正确的。在这个类中,我们可以看到Unity做了大量的初始化工作,并且重写了NativeActvity的相关方法。不知道大家还记不记得我们在前一篇文章中定义主Activity时,我们是让它继承自UnityPlayerActivity而不是Android的Activity。那么,这个UnityPlayerActivity是什么呢?我们打开它的文件:

    package com.unity3d.player;
    
    /**
     * @deprecated Use UnityPlayerNativeActivity instead.
     */
    public class UnityPlayerActivity extends UnityPlayerNativeActivity { }
    这时候我相信大家和博主一样都有一种恍然大悟的感觉,原来它是继承自UnityPlayerNativeActivity的,换句话说Unity在Android这部分其实做了两件事,即初始化Activity和重写相关的方法。我们注意到代码中的注释提示这个类已经deprecated建议我们使用UnityPlayerNativeActivity,这点我们暂时不用管,我们依然使用UnityPlayerActivity,因为它和UnityPlayerNativeActivity本质上是一样的。好了,到目前为止,如果大家已经理解了这里所有的内容,那么我们可以浩浩荡荡地冲向Eclipse开始编写Android项目了。

        

         和昨天一样,我们创建一个Android项目并将其设为库,这里我们将其包名设为com.android.unityview4android。这个名称很重要,我们在Unity中将继续使用这个名字。首先我们来创建一个Android的布局文件activity_main.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
        <Button
            android:id="@+id/BtnPre"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="@string/BtnPre" />
        <LinearLayout  
            android:id="@+id/UnityView"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:layout_above="@+id/BtnNext"  
            android:layout_below="@+id/BtnPre"  
            android:orientation="vertical" >  
        </LinearLayout>
        <Button
            android:id="@+id/BtnNext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="@string/BtnNext" />
    </RelativeLayout>

    这里我们放置了两个Button按钮,分别用来控制Unity向前、向后切换模型,在屏幕中间有一个叫做UnityView的线性布局,它将作为Unity视图的父控件,即我们会将Unity的视图放到这个控件里。我们注意到在UnityPlayerNativeActivity.java类中有一个UnityPlayer类型的变量mUnityPlayer,该类型博主目前没有找到官方的相关说明,博主推测它应该是负责Unity界面渲染的一个类吧,在这个类中有一个getView()方法,它将返回一个View类型的值,我们便可以通过这种方法将其添加到Android视图里,因为我们已经准备好了一个UnityView的父控件,所以这一切实现起来变得相当地容易:

    package com.android.unityview4android;
    
    /*导入Unity提供的类*/
    import com.unity3d.player.UnityPlayer;
    import com.unity3d.player.UnityPlayerActivity;
    
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends UnityPlayerActivity {
    
    	private Button BtnPre,BtnNext;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		//设置当前布局文件
    		setContentView(R.layout.activity_main);
    		//获取显示Unity视图的父控件
    		LinearLayout mParent=(LinearLayout)findViewById(R.id.UnityView);
    		//获取Unity视图
    		View mView=mUnityPlayer.getView();
    		//将Unity视图添加到Android视图中
    		mParent.addView(mView);
    
    		//上一个
    		BtnPre=(Button)findViewById(R.id.BtnPre);
    		BtnPre.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0) 
    			{
    				UnityPlayer.UnitySendMessage("GameObject", "ShowPrevious", "");
    			}
    		});
    		
    		//下一个
    		BtnNext=(Button)findViewById(R.id.BtnNext);
    		BtnNext.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0) 
    			{
    				UnityPlayer.UnitySendMessage("GameObject", "ShowNext", "");
    			}
    		});
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    
    好了,这样我们就完成了Jar库的编写,我们只要将Jar库导入到Unity中,并且按照上一篇文章中所述的方法构建Android插件目录组织相关资源就可以了。最后我们给出AndroidManifest.xml文件:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.unityview4android"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="9"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.android.unityview4android.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>


         二、创建Unity项目
         好了,现在我们来创建Unity项目,我们这里创建一个简单地场景,场景中只有一个空游戏体和摄像机,我们将通过脚本的形式来控制Unity渲染,主要的脚本代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class ModelManager : MonoBehaviour {
    
    	//模型
    	public GameObject[] Models;
    		//当前索引
    	private int index=0;
    	//当前对象
    	private GameObject mObject;
    
    	void Start () 
    	{
    		this.name="GameObject";
    		//生成第一个物体
    		mObject=(GameObject)Instantiate(Models[index]);
    	}
    
    	public void ShowNext()
    	{
    	   //使索引增加
    	   index+=1;
    	   //范围控制
    	   if(index>Models.Length-1){
    			index=0;
    	   }
    	   //销毁原来物体
    	   Destroy(mObject);
    	   //生成新物体
    	   mObject=(GameObject)Instantiate(Models[index]);
    	}
    
    	public void ShowPrevious()
    	{
    		//使索引减少
    		index-=1;
    		//范围控制
    		if(index<0){
    			index=Models.Length-1;
    		}
    		//销毁原来物体
    		Destroy(mObject);
    		//生成新物体
    		mObject=(GameObject)Instantiate(Models[index]);
    	}
    }
    
    这段脚本我们绑定到这个空的游戏体上,脚本的两个方法ShowNext()和ShowPrevious()相对应,通过UnitySendMessage()实现通信。好了,我们来运行项目,如图所示:


    我们可以注意到当程序打开的那一瞬间,是Android视图先加载、然后Unity视图才加载的,给人整体的感觉就是在Activity里面嵌套了一个Activity。可是博主马上就发现了一个问题,这Android视图中的按钮无法取得焦点啊,点击事件无效。这是为什么呢?后来博主找到的解决方法是在AndroidManifest.xml文件中的activity子节点下增加如下两行代码:

                <meta-data android:name="android.app.lib_name" android:value="unity" /> 
                <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    这样问题是解决了,可是我们得搞懂为什么吧,在Unity官方文档中,我们找到了答案:

    请注意,NativeActivity在Android2.3以后被引入而且不支持该版本以下的设备。因为触摸/运动事件处理在本机代码,Java视图通常不会看到这些事件。然而,在统一转发机制允许将事件传播到DalvikVM。为了使用这个机制,您需要修改manifest文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
      <application android:icon="@drawable/app_icon" android:label="@string/app_name">
        <activity android:name=".OverrideExampleNative"
                 android:label="@string/app_name">
        <meta-data android:name="android.app.lib_name" android:value="unity" />
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      </application>
    </manifest> 
    这段话的意思就是说Android的事件是运行在本机代码中的,Java视图是看不到这些事件的,然而我们可以通过Unity提供的统一转发机制将这些事件发送到Android虚拟机,为了使用这个机制,我们必须修改Android的AndroidManifest.xml文件。博主感觉Android插件这块官方目前做得不是很好,总是给人一种云里雾里的感觉,而且通过各种语言相互调用增加了调试的难度,关于Android更多的内容,大家可以参考官方的文档:点击这里.好了,今天的内容就是这样啦,希望大家喜欢。最后再来看看程序运行的效果吧



    每日箴言:这年头连梦想都是有期限的。有想法就去做,即使失败了都比没做来得好,因为失败至少给了你经验,没做只会带给你懊悔。——朱德庸





       ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei

       转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/39348677

       ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       

     为方便大家研究这篇文章,最后给出源代码:

    Unity项目源代码下载

    Android项目源代码下载





    展开全文
  • 最近在用unity3d和Kinect结合开发一个项目,突然间发现了这个博客,感觉其中的Unity3d包太厉害了,挺有意思的,所以推荐给大家。以经本人测试 令,本人使用此工程中的脚本,经过分析,去除了其中冗余的脚本,可以...

    转自:http://yacare.iteye.com/blog/1950164

    最近在用unity3d和Kinect结合开发一个项目,突然间发现了这个博客,感觉其中的Unity3d包太厉害了,挺有意思的,所以推荐给大家。以经本人测试
    令,本人使用此工程中的脚本,经过分析,去除了其中冗余的脚本,可以实现直接传入数据即可控制三维模型动作,不需要实时打开kinect,可以直接读取之前存录的骨骼点数据,参看http://blog.csdn.net/a350203223/article/details/24454805

    一、Unity和Kinect交互的环境配置

    我所使用的Unity3D的版本是Unity4.1,使用的Kinect SDK版本是SDK1.7,令Kinect和Unity交互的方法是使用CMU的封装,但是这个方法支持的Kinect SDK版本是SDK1.0,要想使用1.5及以上版本的Kinect SDK,就要做一些相应的修改。完整的方案如下:

    1、安装Uinty3D

    我使用的Unity3D版本是4.1,也可以在Unity3D官网上下载free版本的Unity。

    2、安装Kinect SDK

    我使用的SDK版本是1.7,可以在Kinect for Windows官方网站上下载。

    3、安装Kinect Wrapper Package for Unity3D

    这个就是CMU封装的用于Kinect开发的Unity3D导入包了。以后在Unity3D工程中,如果需要使用和Kinect交互,那么就需要在这个工程中导入这个包。点击这里下载KinectWrapperPackage

    4、运行示例工程

    在CMU提供的KinectWrapperPackage包中,已经包含了一个叫做KinectExample.untiy的Unity示例工程。在工程中导入KinectWrapperPackage包之后,在Unity的project面板上找到Scences->KinectExample,双击就可以打开这个示例工程。

    打开示例工程后,在Hierarchy面板中,可以看到这些内容:




     
     

    5、修改导入包中的相关文件

    CMU提供的Unity导入包支持的Kinect SDK版本是1.0,如果想使用其他版本的SDK,就要下载并替换导入包中的一些文件。具体来说就是KinectInterop.cs和KinectSensor.cs这两个文件。

    点击这里下载适用于Kinect SDK1.7版本的替换文件



     

    下载完成之后,将下载之后的文件替换掉上面面板中所标识的这两个文件就可以了。然后就可以运行示例工程,体验在Unity创建的场景中使用Kinect控制人物模型及小球的运动。

     

    二、用于Kinect开发的包中包含的资源

    用于Kinect开发的包中(Kinect Wrapper Package for Unity3D)包含了所有我们开发Unity+Kinect需要用到的脚本。

    导入包之后,所有我们需要的资源都会出现在project面板中,具体来说是以下的一些资源:

    Scenes

    KinectExample - 示例场景,这个例子向你展示了如何通过在每一个Kinect 可以追踪的骨骼点上放置小球来产生骨骼运动。以及怎样使用Kinect来控制模型。

     

    Prefabs

    Kinect_Prefab- 这个预设(prefab)包含了我们开发Unity+Kinect程序所必需的所有脚本。但是它并没有包含你需要的用于控制模型的控制器(controller)。

    KinectPointMan - 这个预设(prefab)向你展示了KinectPointController这个控制器是怎样使用的。

     

    Kinect

    KinectModelControllerV2 - 你需要将这个脚本拖放到你想要应用Kinect控制的模型上。为了让模型能够跟上人的节奏,你需要将模型上控制模型动作的关键骨骼拖放到这个脚本暴漏的合适的变量中 ,也就是将模型中的骨骼与kincet识别到的人的骨骼绑定起来。另外这个脚本暴漏的变量中,还有一个变量时标识模型是受哪个玩家控制。

    KinectPointController - 你也需要将这个脚本拖放到场景中的游戏物体上。但是这个游戏物体不是模型,而是由一系列分别代表头部、肩部、手等人体部位的点组成。你需要将游戏物体中的这些关键点都拖放到这个脚本暴漏的外部变量中。这样就可以使用Kinect控制游戏物体了,游戏物体是由一系列的点组成的人体。

    DisplayDepth - 这个脚本得到深度图像。

    DisplayColor - 这个脚本得到RGB图像。

    KinectRecorder - 这个脚本用于记录你的动作,并为Kinect模拟器(emulator)产生回放文件。

    KinectEmulator - 这个脚本模拟Kinect设备.和KinectRecorder产生的回放文件一起工作。

    KinectSensor - 这个脚本从Kinect设备中取得数据。需要替换这个文件使用特用版本的SDK.

    DeviceOrEmulator - 这个脚本设置使用Kinect物理设备还是Kinect模拟设备.

    SkeletonWrapper - 这个脚本抓取骨骼数据.

    DepthWrapper - 这个脚本抓取深度图像数据.

    KinectInterop - 这个脚本从Microsoft Kinect SDK中抓取数据.

    Recordings/playbackDefault - 这是为Kinect模拟设备准备的默认的回放文件.

     

    Models and Materials

    rainbowMan

    这是示例模型。你需要将KinectModelControllerV2这个脚本拖放在这个模型上,并将组成模型的骨骼与脚本中暴漏的骨骼部位变量绑定在一块。然后就开始测试吧。

     

    三、在自己的工程中使用KinectWrapperPackage包

    要想在自己的工程中,使用KinectWrapperPackage包来达到Unity3d和Kinect交互。首先需要导入这个包到Unity中,然后经过下面的步骤完成交互。

    1、设置Kinect_Prefab

    前面提到过了,如果在Unity中和Kinect交互,Kinect_Prefab这个游戏物体是必不可少的。 这个物体需要存在于你的场景中的某处。并且在KinectWrapper 脚本中调用了DontDestroyOnLoad这个函数,所以当你切换场景时,它仍旧存在着,因此你不必在每个场景中都实例一个Kinect_Prefab。

    在Unity中,将project面板中的Kinect_Prefab直接拖拽到Hierarchy面板就可以了。

    2、控制游戏中的角色

    为了控制场景中的角色的移动,你需要将KinectModelControllerV2这个脚本拖拽到场景中的模型上,并绑定骨骼;或者你为了控制一系列的游戏物体,你需要将KinectPointController拖拽这些物体上。下面分别说明这个脚本的使用。

    模型控制器:KinectModelControllerV2

    为使用模型控制器,请按照以下步骤:

    拖拽脚本资源KinectModelControllerV2到场景中的模型中。

    选择场景中的模型。找到模型中的暴漏变量Sw(它代表Skeleton Wrapper). 并将当前场景中的Kinect_Prefab拖拽给Sw这个变量。

    详细展开你的模型,让模型的每一块骨骼在hierarchy面板中可见。

    一个接一个地把模型中的骨骼拖拽到脚本中暴漏的对应的变量中.确保每一个骨骼都对应到了正确的变量上。

    当模型中所有的骨骼都放置好了之后,改变暴漏的Player变量的值,这个变量表明该模型是受哪个玩家控制, 0代表第一个玩家,1 代表第二个玩家。

    接下来要设置暴漏的Mask变量的值。设置合适的值,以决定是所有的骨骼都受Kinect控制,还是仅仅一部分骨骼受Kinect控制.如果这些受Kinect控制的骨骼都不是你想要的,你可以自己写一个控制模型的脚本来代替KinectModelControllerV2。

    当游戏玩家在控制模型时,如果你想要该模型同时播放自带的动画,那么你需要在暴漏的变量中选animated选项,并设置BlendWeight变量的值,来决定模型受自带模型动画和Kinect驱动动作的最终混合效果。该变量取值范围为0到1之间。

    例如示例程序中骨骼和变量的对应关系如下:

     

     

    一系列点的控制器:KinectPointController

     

        为了使用该控制器控制一系列的点,请遵从下面几步:

    在场景中创建一个空物体对象,作为你想要控制的一系列点的容器。将其他的物体拖拽到刚刚创建的空物体中,并放置到相同的位置。使刚才创建的空物体成为这些物体的父节点。拖拽KinectPointController脚本到这些物体的父节点上。选中父节点,在Inspector面板中暴漏的变量中,找到Sw变量 (该变量表示Skeleton Wrapper).拖拽当前场景中Kinect_Prefab赋给这个变量。

    拖拽你想利用Kinect控制的每一个物体到Inspector面板对应的合适的变量中。设置Player变量(代表玩家)和Mask变量(代表哪些骨骼收到监控).

    示例程序中,不同的物体和变量的对应关系如下:

     



     

    我们可以自己建立三维模型,再将其进行骨骼绑定,在Unity3D中将关节点一一对应,就可以用Unity中结合Kinect开发了。


     


    各个关节的对应尤为重要:



    KinectWrapperPackage for SDK 1.7替换文件下载:
    Kinect开发之 Interaction交互设计  
     
    Kinect开发之结合Unity3D进行游戏应用开发
     
    Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)
     
    Kinect开发之简单姿势识别
     
    Kinect开发之获取骨骼关节数据并绘制成火柴人
     
    Kinect开发之获取彩色摄像头数据 
    展开全文
  • Unity3D的WebGL开发(二)与网页代码交互

    万次阅读 多人点赞 2016-11-03 16:33:12
    《一》与你自己开发网页js代码交互:方向一:你可以调用Application.ExternalCall() 和Application.ExternalEval()在你嵌入网页中执行 JavaScript代码. 方向二:在网页的js代码中执行Unity中GameObjects的方法:...

    《一》与你自己开发网页js代码交互:

    方向一:你可以调用Application.ExternalCall()Application.ExternalEval()在你嵌入的网页中执行 JavaScript代码.

    方向二:在网页的js代码中执行Unity中GameObjects的方法:例如

    SendMessage ('MyGameObject', 'MyFunction', 'foobar')

    《二》Application.ExternalCall调用JS函数

    public static function ExternalCall(functionName: string, params args: object[]): void;

    参数:
    functionName 调用的函数名称
    args 给这个函数传的参数列表

    描述:
    调用一个包含webGL的网页中的函数

    这个函数是非阻塞的函数(不等网页执行结果而继续往下执行)

    public class ExampleClass : MonoBehaviour {
        void Example() {
            // Calls MyFunction1 in the web page with no arguments
        Application.ExternalCall ("MyFunction1");
            // Calls MyFunction2 in the web page with a string
            Application.ExternalCall("MyFunction2", "Hello from Unity!");
            // Calls MyFunction3 in the web page with several arguments of different types
            Application.ExternalCall("MyFunction3", "one", 2, 3.0F);
        }
    }

    网页中的HTML

    public static void ExternalEval(string script);

    Parameters
    script 执行的JS代码
    Description

    在嵌入WEBGL的页面中执行JS代码

    
            Application.ExternalEval("history.back()");
    
    展开全文
  • Unity3D嵌入winform或者wpf程序,过去大部分使用UnityWebPlayer插件来实现,这个插件其实就是网页上播放unity页游的插件。 但是使用UnityWebPlayer嵌入桌面开发有各种问题,我认为最大的问题是效率问题(加载...
  • Unity播放视频主要支持mov, .mpg, .mpeg, .mp4, .avi, .asf格式。...unity3d教程-如何在unity3d嵌入播放视频  [html] view plaincopyprint?    public var movTexture : MovieTexture;    fun
  • Unity3D嵌入winform或者wpf程序,过去大部分使用UnityWebPlayer插件来实现,这个插件其实就是网页上播放unity页游的插件。 但是使用UnityWebPlayer嵌入桌面开发有各种问题,我认为最大的问题是效率问题(加载...
  • 出处:http://www.cnblogs.com/NuclearBoy/articles/6092221.html写在前面:另百度文库里有一篇好的文章:https://wenku.baidu.com/view/d8be1b183c1ec5da51e27007.html 把Unity3D嵌入winform或者wpf程序,过去大...
  • 一个android项目中需要用到3D的游戏元素,所以我们打算把一个untiy3d的项目嵌入到android原生项目中,下一篇接unity3d项目嵌入到ios原生项目。 环境配置: unity2018 (之前测试的unity5.6.x和unity2017也没问题) ...
  • Unity3D浏览器调用HTML网页中的函数

    千次阅读 2014-04-25 22:03:27
    谈谈今天的学习收获,...下面简单谈谈通过Unity3D调用HTML网页的脚本函数,以及通过HTML网页调用Unity3D中的脚本函数。 1.1Unity3D浏览器调用HTML网页中的函数 Unity3D浏览器通过执行Application.ExternalCall()来
  • Unity3D网页数据交互的基本原理

    千次阅读 2015-08-10 09:45:03
    1、Unity3D的游戏引擎是和编辑器集成在一起的,所有它也是一个制作/开发平台。 2、Unity3D是使用JavaScript、C#作为核心脚本语言来驱动事个游戏引擎。 3、平台可以发布Exe执行文件或者打包为可供网页调用的一个独立...
  • 1.unity发布webGL 2.vs新建ASP.NET web应用程序,框架选择4.5,然后选择窗体模式 3.从文件夹将发布的webGL文件夹复制vs新建的项目目录下 4.在vs项目中显示所有文件,并将unityfabu文件夹包含项目中 5.修改...
  • Unity中内嵌网页插件 UniWebView 2.8使用

    万次阅读 热门讨论 2016-11-14 20:48:02
    UniWebView2:适用于Andriod、ios和Mac os,在移动端效果最好。支持WP8,不支持windows桌面系统,包括编辑器状态。 Unity4.x版本是 UniWebViewUnity AssetStore 上的插件:
  • [Unity3d]unity与html通信

    万次阅读 2019-07-26 09:54:06
    更多教程请访问: ... 谈谈今天的学习收获,发现了一个好东西,unity与html能够相互通信,意味着我之前学的web开发还能在unity中用得上,哈哈,太happy了!下面简单谈谈通过Unity3D调用HTML网页的脚本...Unity3D浏览...
  • Unity3d场景快速烘焙【2019】

    万次阅读 多人点赞 2019-12-26 19:09:28
    很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不结果,...
  • Unity内嵌浏览器脚本

    千次阅读 2018-01-17 09:50:54
    资源名称:Embedded Browser 资源大小: 117.4MB 资源版本: v1.0.2 ...官网地址:https://www.assetstore.unity3d.com/cn/#!/content/55459 网盘下载地址:链接: https://pan.baidu.com/s/1qXXMp
  • 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。 本地客户端开发入门 本地客户端 ...
  • Unity3D开发之Lua学习(一)环境配置

    千次阅读 2018-05-21 10:24:22
    首先,我们要在github网站下载我们需要的xlua插件,地址:点击打开链接。...打开我们unity安装目录,将图下三个dll拖放F:\***\Assets\XLua\Src\Editor文件夹下。然后我们打开unity面板的Player...
1 2 3 4 5 ... 20
收藏数 523
精华内容 209
关键字:

unity3d嵌入到网页开发