精华内容
下载资源
问答
  • 每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习! 免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时...

    每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习!
    免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时快速入门,7天unity3d自学教程学习,能力快速提升,优质作品随手呈现!

    unity3d菜鸟自学教程介绍

    unity3d难学吗?

    unity3d自学教程目录

    unity3d视频教程百度网盘下载

    unity3d难学吗?
    学习unity3d特效,多来学习路线网看教程,一线游戏特效老师,游戏特效就业安排!学习unity3d特效入门+进阶+精通选择专业才能学得专业!

    unity3d自学教程目录
    课程介绍:
    Unity3d史诗 MMO ARPG 课程《泰斗破坏神》,精心设计将包含200+课时,由视频课时+直播课时+测试课时混合组成。最重头unity3d ARGP课程,完整的 ARPG 网络游戏开发教学。包含多人合作,在线多人游戏开发,角色创建系统,作战系统,RPG系统,技能系统,任务系统,商店系统。

    课程大纲:

    单机版功能实现

    项目概要
    登录系统
    角色创建、选择、自定义系统
    场景加载与游戏存储记录
    角色控制
    聊天通讯
    游戏AI
    战斗系统
    游戏角色与玩家信息系统
    商店系统
    道具系统
    装备系统
    装备与道具掉落
    仓库与背包系统
    副本系统
    任务系统
    地图与寻路系统

    网络版功能实现

    服务端搭建
    登录系统
    角色选择
    游戏场景
    聊天功能
    角色具体信息
    商店系统
    道具系统
    装备系统
    仓库和背包
    副本系统
    任务系统

    unity3d视频教程百度网盘下载
    http://www.xuexiluxian.net/unity3d-cainiao-zixue.html

    展开全文
  • 这个工具呢,博主在Unity3D游戏开发之反编译AssetBundle提取游戏资源这篇文章中其实已经提到过了,不过因为有些朋友对如何使用这个工具依然存在问题,所以博主决定特地写一篇文章来讲解如何使用disunity来提取Unity...

    各位朋友,大家好,我是秦元培。今天博主想和分享的是使用disunity提取Unity3D游戏素材。这个工具呢,博主在Unity3D游戏开发之反编译AssetBundle提取游戏资源这篇文章中其实已经提到过了,不过因为有些朋友对如何使用这个工具依然存在问题,所以博主决定特地写一篇文章来讲解如何使用disunity来提取Unity3D游戏中的素材。

    准备工作

    • disunity:负责对Unity3D的数据文件进行解包
    • Unity3D:负责将导出的数据文件显示出来
    • Bleander或者3DsMax:负责Unity3D数据文件的转换处理,二选一即可。个人推荐Blender。
    • Java:负责为disunity提供编译环境

    测试文件

    • 《新仙剑OL》下载
    • 《轩辕剑6外传穹之扉》
    • 《雨血前传:蜃楼》下载

    提取流程

    好了,在确定做好所有的准备工作后,我们就可以正式开始今天的内容了!

    编译disunity

    虽然我们可以从disunity的项目主页中下载release版本,不过为了保险起见,博主依然建议大家自行编译disunity。编译的方法是在命令行中切换到disunity的目录,然后执行命令:

    java -jar disunity.jar

    如果大家的Java环境没有任何问题的话,那么接下来我们就应该可以看到:

    [Info] DisUnity v0.3.4

    以及各种关于这个工具的使用方法和参数选项。那么好了,现在我们就来熟悉下disunity这个工具的常用命令。disunity命令的基本形式是:

    disunity [CommandName] [CommandOptions]

    disunity命令

    • dump:将一个二进制的对象转化成人类可以阅读的文本信息。
    • dump-struct:将一个二进制的对象转化为结构化的信息。
    • extract:将Unity3D的数据文件转化为常见的文本、声音、图片等信息。
    • extract-raw:将Unity3D的数据文件转化为可序列化的对象,在extract命令不被支持的情况下使用。
    • extract-txt:和dump命令类似输出转换结果到命令行。
    • extract-struct:和dump-struct命令类似输出转换结果到命令行。
    • info:输出Unity3D的数据文件和AssetBundle文件的变量信息。
    • bundle-extract:释放所有的被打包到AssetBundle中的文件。
    • bundle-inject:将从AssetBundle中打包的文件重新打包

    暂时先介绍这些,因为其它的命令我们基本用不到,如果需要深入研究这些命令,可以参考disunity项目中的README.md文件。

    解析《新仙剑OL 》的AssetBundle文件

    这里我们以游戏目录/assetbundles/NPC/Models/下的s049.unity3d_CC9026FB为例来讲解游戏模型的提取。

    模型文件提取

    首先我们将这个文件的扩展名改为s049.unity3d,因为这是它原始的扩展名,是Unity3D中导出AssetBundle的一种文件格式。好了,我们将这个文件放在一个无中文路径的目录下,这里以C:\Users\Robin\Desktop即桌面为例。注意首先进入disunity的目录,然后执行命令:

    disunity extract C:\Users\Robin\Desktop\s049.unity3d

    接下来会在桌面生成一个名为s049的文件夹,在这个文件夹中找到Mesh的子文件夹,会得到一个s049.obj的文件,这个文件就是我们提取到的模型文件。

    模型贴图提取

    好了,下面我们再来看看怎么提取这个模型文件对应的贴图,在游戏目录/assetbundles/NPC/Texture/下有一个名为s049_1.unity3d_1D2446B9的文件,这就是s049这个模型对应的贴图了。同样地,我们将其重命名为s049_1.unity3d然后执行命令:

    disunity extract C:\Users\Robin\Desktop\s049_1.unity3d

    接下来在桌面上生成一个名为s049_1的文件夹,在这个文件夹中找到Texture2D的子文件夹,会得到一个名为s049_1.dds的贴图文件,这就是我们要提取的模型s049的贴图文件。

    将模型和贴图合并

    我们打开Blender并将s049.obj文件导入,然后将场景中默认的灯光和摄像机都删除,因为我们只需要一个模型文件,我们发现在Blender中已经可以看到模型了,因为Unity3D中使用的是FBX模型,所以我们这里将模型文件导出为FBX备用。因为Unity3D可以识别dds类型的贴图,所以对贴图我们不用做任何处理。

    童年林月如的模型

    打开Unity3D将童年林月如的模型和贴图一起导入,将童年林月如的模型拖入到游戏场景中,因为模型的尺寸没有经过调整,所以模型刚开始可能会比较小,我们可以在Unity3D进行局部的调整。接下来我们会发现模型没有贴图,只要选择这个模型然后在属性窗口为它附上s049_1.dds的贴图文件即可。下面是童年林月如的模型导入Unity3D以后的效果:

    童年林月如导入Unity3D后的效果

    解析《新仙剑OL》的assets文件

    和AssetBundle不同,assets文件是整个Unity3D项目中项目资源的打包集合,比如说Asset文件下的资源都会被打包到这里,所以说解析assets文件可能会有更大的收获吧!因为所有的Unity3D游戏都会有这样的文件,而AssetBundle文件只有在使用了这项技术的游戏项目中才有。比如说在Unity3D中有一个重要的Resource文件夹,这个文件夹打包后被被打包成resources.assets文件。这里我们以xianjian_Data/resources.assets文件为例。首先执行命名:

    disunity extract C:\Users\Robin\Desktop\resources.assets

    接下来会在桌面生成一个resources的文件夹,打开这个文件夹我们会发现三个子文件夹,分别是Shader、TextAsset和Texture2D。解析的结果似乎有点失望,不过在TextAsset文件夹下我们会找到一个叫做ResourceFiles.txt的文件,这是一个纯文本文件,我们可以直接打开,打开后我们发现它的内容是一个Xml文件,并且在这个Xml文件中定义了游戏中使用的各种资源的路径,不过这些资源都是以AssetBundle的形式来定义的。这说明什么呢?这说明《新仙剑OL》的场景和界面资源是通过动态加载的方式加载到游戏当中的,而这些资源则是通过这个Xml文件来配置和管理的,这符合我们平时在Unity3D游戏开发中的观点和方法。通过这个文件,我们找到了assetbundles/config/movieconfig.unity3d这个文件,这是一个负责维护游戏中场景过场动画的文件。下面我们就来尝试解析这个文件,不过游戏制作方对config文件夹下的内容进行了加密,因为在这个文件夹下面是两个AssetBundle文件,博主尝试用extract和bundle-extract两个命令进行解析,可是得到的只是些文本文件,对我们继续研究没有什么帮助。那么好了,现在我们能够进行解析的只有xinjian_Data/sharedassets0.assets文件了:

    disunity extract C:\Users\Robin\Desktop\sharedassets0.assets

    这个解出来的话是些没有什么用的贴图文件,看来如果要提取音乐或者图片的话,还需要进行更加深入的研究才行啊。

    解析《雨血前传.蜃楼》的assets文件

    因为解析《新仙剑OL》的assets文件没有得到什么有用的东西,所以我们接下来来尝试解析《雨血前传.蜃楼》的assets文件。这款游戏是博主比较喜欢的一款游戏,基于Unity3DY引擎,而且这款游戏是作为Unity3D官方范例来推广的,因此研究这款游戏对我们提高Unity3D的资源打包机制会比较有帮助。好了,我们直接上手:

    disunity extract C:\Users\Robin\Desktop\resources.assets

    哈哈,这款游戏果然没有让我们失望,我们得到了什么呢?

    蜃楼中各种Boss的头像

    蜃楼中游戏连招视频1

    蜃楼中游戏连招视频2

    总结

    • 不同的游戏采用的资源配置方案都不同,不过一般可以从resources.assets这个文件入手作为突破点。
    • 如果能拿到游戏中数据配置方案,对于我们提取游戏中的素材会有较大的帮助,因为这样方向性会更强些。
    • 通过AssetBundle动态加载到场景中最好还是采用一个配置表来进行配置,这样便于我们管理和维护整个游戏项目。
    • 如果没有服务器段的干预,理论上只要修改了本地的AssetBundle文件就可以实现对游戏内容和数据的更改,换句话说,可以做外挂和修改器。

    声明:我不是在教你破解游戏,我只是在研究AssetBundle打包 !

    展开全文
  • [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

    万次阅读 热门讨论 2014-10-01 18:17:38
    今天呢,博主将为大家送上Unity-Android系列的最后一篇文章《Unity3D游戏开发之从Unity3D到Eclipse》。通过前面的学习,大家已经知道通过在Eclipse中为Unity编写插件的方法,我们可以实现在Unity与Android API的通信...

           

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

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

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

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


           各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。首先祝大家能够度过一个愉快的十一长假。今天呢,博主将为大家送上Unity-Android系列的最后一篇文章《Unity3D游戏开发之从Unity3D到Eclipse》。通过前面的学习,大家已经知道通过在Eclipse中为Unity编写插件的方法,我们可以实现在Unity与Android API的通信。可是不幸的是,这种方法并不能对所有的Android API奏效,在某些时候,我们需要反客为主,将Unity项目导出为Android项目,然后在Eclipse中继续修改游戏的内容。这种方法在《Unity3D游戏开发之Unity与Android交互调用研究》这篇文章中已经提及,不过并没有真正地进行过研究。之前有个叫@SHANlover的朋友问我,能不能写一篇Unity项目导出Eclipse的文章,因此博主便抽空研究了下这种方法,从而有了今天的这篇文章。首先,我们来创建一个简单地场景:


           好了,创建完场景以后我们就可以直接编写一个脚本CubeScripts.cs来控制场景中的Cube:

    using UnityEngine;
    using System.Collections;
    
    public class CubeScripts : MonoBehaviour {
    
    	/// <summary>
    	/// 定义旋转速度
    	/// </summary>
    	public float RotateSpeed=45;
    
    	/// <summary>
    	/// 定义摄像机的最近距离	
    	/// </summary>
    	private float mNear=2.5F;
        
    	/// <summary>
    	/// 摄像机当前距离
    	/// </summary>
    	private float mDistance=5F;
    
    	/// <summary>
    	/// 定义摄像机的最远距离
    	/// </summary>
    	private float mFar=7.5F;
    
    	/// <summary>
    	/// 摄像机的缩放速率
    	/// </summary>
    	private float mZoomRate=0.5F;
    
    	/// <summary>
    	/// 主摄像机
    	/// </summary>
    	private Transform mCamera;
    	
    	/// <summary>
    	/// 在Start()方法中我们设定了游戏体的名称,因为我们在
    	/// Android项目中需要用到这个名称,同时获取主相机对象
    	/// </summary>
    	void Start () 
    	{
    		this.name="Main Cube";
    		mCamera=Camera.main.transform;
    	}
    	
    	/// <summary>
    	/// 在Update()方法中我们让Cube按照一定的速度进行旋转
    	/// </summary>
    	void Update () 
    	{
    		transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
    	}
    
    
    	/// <summary>
    	/// 定义一个放大的方法供外部调用
    	/// </summary>
    	public void ZoomIn()
    	{
    		mDistance-=mZoomRate;
    		mDistance=Mathf.Clamp(mDistance,mNear,mFar);
    		mCamera.position=mCamera.rotation * new Vector3(0,0,-mDistance)+transform.position;
    	}
    
    	/// <summary>
    	/// 定义一个缩小的方法供外部调用
    	/// </summary>
    	public void ZoomOut()
    	{
    		mDistance+=mZoomRate;
    		mDistance=Mathf.Clamp(mDistance,mNear,mFar);
    		mCamera.position=mCamera.rotation * new Vector3(0,0,-mDistance)+transform.position;
    	}
    }
    
    这段脚本十分地简单,没有什么可说的,在这里我们定义了两个方法ZoomIn和ZoomOut,这两个方法我们将提供给Android来调用。我们将这段脚本绑定到Main Cube这个对象上。接下来,我们将项目Build一下,这里我们将项目的PackageName设为com.android.unity2eclipse,然后将其导出为一个Android项目:


              那么,这样我们就得到一个可以在Eclipse中打开的Android项目。可是这个Android项目我们怎么样使用呢?在金曾玺老师《Unity3D手机游戏开发》一书中是将Unity导出的Android项目作为一个库,然后再用一个新的Android项目去调用这个库。这本书中所使用的Unity版本是4.X,而博主所使用的Unity版本是4.5.1。最初博主就是按照这种思路去编写Android程序,可是在经历了无数次的失败后,博主开始怀疑这种方法的正确性。带着尝试的念头,博主直接运行了由Unity导出的Android项目,结果程序成功地在手机上运行了。如图:


           那么,接下来我们不妨冷静地分析下从Unity导出的这个Android项目,我们可以看到整个项目的目录结构是这样的:


    在这个目录结构中,我们可以看到它是一个标准的Android项目,在libs中的unity-class.jar就是我们在前面的文章中所使用过的jar库文件。而在assets文件夹中我们可以看到Unity所依赖的dll文件。在com.android.unity2eclipse这个Package中,我们会发现一个名为UnityPlayerNativeActivity.class的类,该类定义如下:

    package com.android.unity2ecplise;
    
    import 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.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); }
    }
    
    相信大多数看过我博客的人都会觉得这个类有点眼熟吧,不错,在之前的《Unity3D游戏开发之在Android视图中嵌入Unity视图》这篇文章中,我们就是利用这个类实现了在Android视图中嵌入Unity视图,只不过当时这个类是定义在Unity的unity-class.jar这个库中的,而更为确切地位置是在com.unity3d.player这个包下面的UnityPlayerNativeActivity类,我们注意到此时这个类是继承自NativeActivity的,在前面的文章中博主曾经提及这个类,它是Android提供给C/C++开发者的接口。换句话说,Unity项目在Android平台上内部依靠的实际上就是NativeActivity接口,只不过Unity自己使用的接口是封装过的,而我们这里使用的接口是直接继承自父类。那么,我们在这一刻就会产生疑问,从这个类从具体实现上来讲主要的功能就是对Activity进行初始化,那么我们在Activity中能够看到什么由谁来决定呢?大家注意到这里有一个SetContentView()的方法,它传入了UnityPlayer类型的参数作为Activity显示的内容。相信从现在开始,大家对Unity提供的Android接口的认识会越来越清晰吧。为了验证我们的想法,接下来,我们来创建一个布局文件activity_main,它的代码定义如下:

    <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/BtnZoomIn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="@string/ZoomIn" />
        <LinearLayout  
            android:id="@+id/UnityView"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:layout_above="@+id/BtnZoomOut"  
            android:layout_below="@+id/BtnZoomIn"  
            android:orientation="vertical" >  
        </LinearLayout>
        <Button
            android:id="@+id/BtnZoomOut"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="@string/ZoomOut" />
    </RelativeLayout>
    接下来,我们创建与之对应的Java类文件MainActivity.class:

    package com.android.unity2ecplise;
    
    import com.android.unity2ecplise.R;
    import com.unity3d.player.UnityPlayer;
    
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    
    /*我们这里让我们定义的MainActivity继承自Unity导出项目中的UnityPlayerNativeActivity*/
    public class MainActivity extends UnityPlayerNativeActivity 
    {
    	private Button BtnZoomIn,BtnZoomOut;
    	
    	@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);
    		
    		//放大
    		BtnZoomIn=(Button)findViewById(R.id.BtnZoomIn);
    		BtnZoomIn.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0) 
    			{
    				UnityPlayer.UnitySendMessage("Main Cube","ZoomIn","");
    			}
    		});
    		//缩小
    		BtnZoomOut=(Button)findViewById(R.id.BtnZoomOut);
    		BtnZoomOut.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0) 
    			{
    				UnityPlayer.UnitySendMessage("Main Cube","ZoomOut","");
    			}
    		});
    	}
    }
    
    在这段代码中,我们通过UnitySendMessage调用了Unity中定义的两个方法ZoomIn、ZoomOut。好了,接下来,我们修改配置文件,使主Activity对应于MainActivity类,打开
    AndroidManifest.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.android.unity2ecplise" 
        android:theme="@android:style/Theme.NoTitleBar" 
        android:versionName="1.0" android:versionCode="1" 
        android:installLocation="preferExternal">
      <supports-screens android:smallScreens="true" 
          android:normalScreens="true" 
          android:largeScreens="true" 
          android:xlargeScreens="true" 
          android:anyDensity="true" />
      <application android:icon="@drawable/app_icon" 
          android:label="@string/app_name" 
          android:debuggable="false">
        <activity android:label="@string/app_name" 
            android:screenOrientation="fullSensor" 
            android:launchMode="singleTask" 
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" 
            android:name="com.android.unity2ecplise.MainActivity">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
          <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
        </activity>
      </application>
      <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" />
      <uses-feature android:glEsVersion="0x00020000" />
    </manifest>
    如我们所猜测的那样,acivity节点的name属性对应于com.android.unity2ecplise.UnityPlayerNativeActivity。这说明在此之前,Android是以这个类作为主Acivity。现在我们将其改为我们自己定义的类,这样我们就能使用自己定义的布局。同时大家会注意到下面这两行:

          <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
          <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    之前我们在讲Unity视图嵌入Android视图时曾经碰到过Android视图无法取得焦点的问题,当时就是在配置文件中加入了这样两行代码,此时此刻,大家是不是和博主一样有种大彻大悟的感觉呢。我们运行程序,会发现界面像我们所希望看到的那样被改变了,而且我们可以通过两个按钮来改变视图中立方体的大小:





    这样我们就可以认识到从Unity中导出的就是Android项目,我们可以直接将其修改来达到满足我们要求的目的。至于金曾玺老师的这种方法,在官方API文档中的确有提到过这种方法,不过博主尝试了好久,这种方法都失败了,不知道是不是因为Unity在新版本中已经解决了这个问题,从而可以直接导出可运行的Android项目。

            最后来说说网络上流传的一种方法,据说在Unity中将项目Build下就会在工程目录下的Temp文件夹下生成一个名为StagingArea文件夹,我们将这个文件夹在导入到Eclipse中并将其设为一个库,然后在新建的Android项目中引用这个库,并将这个项目中的assets文件夹覆盖新建项目中的assets文件夹,然后我们只要让主Acitivity继承Unity提供的Android接口中的UnityPlayerActivity即可。这种方法博主并没有去尝试,不过在Build的时候确实会产生这样一个文件夹,不过博主觉得这样是不是有点麻烦了啊,既然Unity导出的Android项目直接就能用,我们何必要再去用这种复杂的方法呢,不过我觉得大致的思路就是这样的,UnityPlayerActivity负责Acivity生命周期的维护,UnityPlayer负责渲染Unity场景中的内容,而我们在Unity中使用的资源都被Unity的引擎在内部进行了处理,总之把握了这些,Unity和Android的交互就基本没什么问题了。好了,谢谢大家关注我的博客,今天的内容就是这样了,希望大家喜欢。


    每日箴言:有些路看起来很近,可是走下去却很远的,缺少耐心的人永远走不到头。人生,一半是现实,一半是梦想。 ——顾城




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

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

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

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


    本文源代码下载:Unity项目 Android项目


    展开全文
  • [Unity3D]Unity3D游戏开发之截屏保存精彩瞬间

    万次阅读 多人点赞 2014-09-10 20:28:00
    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/...比如博主在写《[Unity3D]Unity3D游戏开发之自由视角下的角色控制》和《[Unity3D]Unity3D游戏开发之角色控制漫谈》这两篇

            各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。今天我们来做点简单的东西,做个什么呢?答案就是截屏。作为一名热爱单机游戏的玩家,博主每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧。比如博主在写[Unity3D]Unity3D游戏开发之自由视角下的角色控制》[Unity3D]Unity3D游戏开发之角色控制漫谈》这两篇文章时,碰到博主无法把握的问题的时候就是通过玩游戏来体会的,在玩游戏的过程中博主总是会抓取博主比较喜欢的画面,如图,下面是博主收集的部分截图:




           好了,欣赏完美丽的风景,下面我们就来一起学习在Unity3D实现截屏,先给出实现截屏的三种实现方式:

    /// <summary>
    	/// 使用Application类下的CaptureScreenshot()方法实现截图
    	/// 优点:简单,可以快速地截取某一帧的画面、全屏截图
    	/// 缺点:不能针对摄像机截图,无法进行局部截图
    	/// </summary>
    	/// <param name="mFileName">M file name.</param>
    	private void CaptureByUnity(string mFileName)
    	{
    		Application.CaptureScreenshot(mFileName,0);
    	}
    
    	/// <summary>
    	/// 根据一个Rect类型来截取指定范围的屏幕
    	/// 左下角为(0,0)
    	/// </summary>
    	/// <param name="mRect">M rect.</param>
    	/// <param name="mFileName">M file name.</param>
    	private IEnumerator CaptureByRect(Rect mRect,string mFileName)
    	{
    		//等待渲染线程结束
    		yield return new WaitForEndOfFrame();
    		//初始化Texture2D
    		Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
    		//读取屏幕像素信息并存储为纹理数据
    		mTexture.ReadPixels(mRect,0,0);
    		//应用
    		mTexture.Apply();
    		
    		
    		//将图片信息编码为字节信息
    		byte[] bytes = mTexture.EncodeToPNG();  
    		//保存
    		System.IO.File.WriteAllBytes(mFileName, bytes);
    		
    		//如果需要可以返回截图
    		//return mTexture;
    	}
    
    	private IEnumerator  CaptureByCamera(Camera mCamera,Rect mRect,string mFileName)
    	{
    		//等待渲染线程结束
    		yield return new WaitForEndOfFrame();
    
    		//初始化RenderTexture
    		RenderTexture mRender=new RenderTexture((int)mRect.width,(int)mRect.height,0);
    		//设置相机的渲染目标
    		mCamera.targetTexture=mRender;
    		//开始渲染
    		mCamera.Render();
    		
    		//激活渲染贴图读取信息
    		RenderTexture.active=mRender;
    		
    		Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
    		//读取屏幕像素信息并存储为纹理数据
    		mTexture.ReadPixels(mRect,0,0);
    		//应用
    		mTexture.Apply();
    		
    		//释放相机,销毁渲染贴图
    		mCamera.targetTexture = null;   
    		RenderTexture.active = null; 
    		GameObject.Destroy(mRender);  
    		
    		//将图片信息编码为字节信息
    		byte[] bytes = mTexture.EncodeToPNG();  
    		//保存
    		System.IO.File.WriteAllBytes(mFileName,bytes);
    		
    		//如果需要可以返回截图
    		//return mTexture;
    	}
    
    }
    

          接下来,我们来调用这三个方法实现一个简单的截图的例子:

    //定义图片保存路径
    	private string mPath1;
    	private string mPath2;
    	private string mPath3;
    
    	//相机
    	public Transform CameraTrans;
    
    	void Start()
    	{
    		//初始化路径
    		mPath1=Application.dataPath+"\\ScreenShot\\ScreenShot1.png";
    		mPath2=Application.dataPath+"\\ScreenShot\\ScreenShot2.png";
    		mPath3=Application.dataPath+"\\ScreenShot\\ScreenShot3.png";
    	}
    
    	//主方法,使用UGUI实现
    	void OnGUI()
    	{
    		if(GUILayout.Button("截图方式1",GUILayout.Height(30))){
    			CaptureByUnity(mPath1);
    		}
    		if(GUILayout.Button("截图方式2",GUILayout.Height(30))){
    			StartCoroutine(CaptureByRect(new Rect(0,0,1024,768),mPath2));
    		}
    		if(GUILayout.Button("截图方式3",GUILayout.Height(30))){
    			//启用顶视图相机
    			CameraTrans.camera.enabled=true;
    			//禁用主相机
    			Camera.main.enabled=false;
    			StartCoroutine(CaptureByCamera(CameraTrans.camera,new Rect(0,0,1024,768),mPath3));
    		}
    	}
    
    
    	
           在第三中截图方式中,博主在场景里放了一个名为TopCamera的摄像机,它垂直向下投影到游戏场景里,这样可以使玩家看到场景的顶视图。这里我们用这个相机来测试第三个方法,此时需要先激活该相机。场景设置如图:


            我们下面来看三种方法截图的效果:





            从截图的效果来看,第一种方法的效果是最好的,不过定制化是个问题。第二种方法效果一般吧,感觉这里TextureFormat没有选好吧。第三种效果基本达到了博主想要的要求,不过摄像机的投影范围似乎没有设计好。这里我们发现第二张截图会把编辑器的窗口渲染到里面,博主认为是程序运行的时候,即使将Game窗口放到最大,仍然会受到窗口的影响,后来博主就把程序编译成可执行文件,不过程序运行完之后,博主却没有找到对应的截图。后来查找了官方的API才知道原因是这样的:

    Description

    Contains the path to the game data folder (Read Only).

    The value depends on which platform you are running on:

    Unity Editor: <path to project folder>/Assets

    Mac player: <path to player app bundle>/Contents

    iPhone player: <path to player app bundle>/<AppName.app>/Data

    Win player: <path to executablename_Data folder>

    Web player: The absolute url to the player data file folder (without the actual data file name)

    Flash: The absolute url to the player data file folder (without the actual data file name)

    Note that the string returned on a PC will use a forward slash as a folder separator
     

            显然,我们从这里可以知道Application.datapath在不同的平台上对应的位置。对于可执行(.exe,Windows平台)的文件,它对应在和应用程序对应的一个文件夹里,例如可执行文件的名字叫做UnityGame,那么对应的位置就是UnityGame_Data这个文件啦。所以博主的问题应该是出在没有在这里建一个ScreenShot的文件夹,希望大家以后做相关项目的时候注意一下吧。好了,这就是今天的内容了,希望大家喜欢啊。


    每日箴言:无所谓好或不好,人生一场虚空大梦,韶华白首,不过转瞬。惟有天道恒
    在,往复循环,不曾更改——慕容紫英。




       喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
       转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/39185195




    展开全文
  • Unity3D游戏开发之邂逅Unity3D

    千次阅读 热门讨论 2014-03-16 01:32:43
    所以,从今天起,大家将看到由我为大家带来的Unity3D系列文章,让我们一起来学习Unity3D游戏开发吧!  在正式今天的文章之前,博主想简单介绍下博主自己,博主是一个喜欢仙剑、古剑的武侠类RPG游戏玩家,博主喜欢...
  • unity3D游戏开发

    2019-08-09 13:43:06
    本课程将带着大家学习unity3d中shader的基础内容!!!
  • [Unity3D]Unity3D游戏开发之跑酷游戏项目讲解

    万次阅读 多人点赞 2014-05-11 00:24:02
    大家晚上好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/...所以,今天的博客的主题就是《Unity3D游戏开发之跑酷游戏项目讲解》。从博主自身来考虑这件事情,当你选择做自己热爱的事情的时
  • Unity3D游戏开发之使用Unity3D开发2D游戏 (一)

    万次阅读 热门讨论 2014-03-17 09:14:17
    今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游戏中人物的走动控制。...
  • [Unity3D]Unity3D游戏开发之粒子系统

    千次阅读 2014-04-07 18:23:05
    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。  今天为大家分享的是Unity3D中的粒子系统,粒子系统通常用来表现烟雾、云等高级效果,是一个...
  • 今天博主想和大家分享的是Unity3D场景编辑器的扩展开发,相关的话题我们在Unity3D游戏开发之编辑器扩展程序开发实例这篇文章中我们已经有所涉及,今天博主想特别针对场景编辑器的扩展开发来进行下深入研究。...
  • Unity3D游戏开发

    2020-12-22 23:57:48
    本课程从初学者角度出发,以低起点,高终点为原则,内容覆盖了Unity游戏开发的所有基础知识。为了让学员不仅能掌握好基础知识,还能够学到实际项目的开发,本课程还配套了两个游戏项目。【课程特点】1  ...
  • [Unity3D]Unity3D 游戏开发之碰撞检测

    万次阅读 2014-04-07 12:43:03
    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。 今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中...
  • 在Unity4.3版本以后,Unity3D推出了基于Box2D的2D组件,使得Unity3D成为一个可以支持2D游戏开发的游戏引擎。在Unity3D推出这一功能之前,大家对使用Unity3D开发2D游戏已经进行了大量的研究。所以,Unity3D推出2D组件...
  • Unity3D游戏开发之从Unity3D到Eclipse

    千次阅读 2015-03-12 16:52:46
    今天呢,博主将为大家送上Unity-Android系列的最后一篇文章《Unity3D游戏开发之从Unity3D到Eclipse》。通过前面的学习,大家已经知道通过在Eclipse中为Unity编写插件的方法,我们可以实现在Unity与Android
  • [Unity3D]Unity3D游戏开发之自由视角下的角色控制

    万次阅读 热门讨论 2014-09-08 01:32:37
    在上一篇文章[Unity3D]Unity3D游戏开发之角色控制漫谈>一文中,博主与大家分享自己在角色控制方面的一些感悟。今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由...
  • Unity3D游戏开发之Unity3D动画与Mecanim动画系统 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学院,致力...
  • 本文采用的方法依然是在[Unity3D]Unity3D游戏开发之自由视角下的角色控制这篇文章中所采用的方法,所以如果大家对于这部分内容不太了解的话,最好先去看看这篇文章。好了,下面我们将以一个具体的实例来讲解今天的...
  • 今天我想和大家聊聊Unity3D游戏项目的版本控制。1、为什么要进行版本控制?  当我一个人写代码的时候,在我的脑海中是不存在版本控制这个概念的,因为我对整个项目的代码如数家珍。可是当我和一群人在一起写代
  • unity3d书籍】unity3d认证教材Unity 4.x从入门到精通 ... 【unity3d书籍】Unity 3D游戏开发(国内第一本本版Unity 3D图书) http://www.xuanyusong.com/archives/1413 【unity3d书籍】Unit
  • unity3d游戏开发教程

    2015-08-29 14:16:54
    正准备学习unity3d游戏开发,给大家推荐一个好的学习网站。 unity3d游戏开发
  • 博主本来计划在Unity3D游戏开发之从《魂斗罗》游戏说起(上)——目标追踪这篇文章后再写一篇《Unity3D游戏开发之从《魂斗罗》游戏说起(下)》,不过目前博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享...
  •  在前面的文章中,我们分别实现了一个自定义的角色控制器《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》和角色死亡的效果《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现》。今天我们继续来做...
  • 在我之前的文章《Unity3D游戏开发之小地图的实现》一文中,我为大家讲解了基于OnGUI()方法绘制贴图实现小地图的方法。那么,今天呢,博主再来为大家分享一种实现小地图的方法。在正式开始今天的文章之前,我们先来...
  • 在之前的三篇系列文章《Unity3D游戏开发之Lua与游戏的不解之缘》中,博主带领大家一起领略了Lua在游戏开发中强大而迷人的作用,通过UniLua这个开源项目我们将Lua引入了Unity3D的世界,并且在此基础上我们写出了Lua'...
  • Unity3D 游戏引擎之平面小球重力感应详解

    千次下载 热门讨论 2011-11-14 16:53:35
    雨松MOMO Unity3D 游戏开发系列博文之Unity3D 游戏引擎之平面小球重力感应详解,欢迎大家下载阅读,哇咔咔~~
  •  感谢对我的支持,在上一篇文章《 [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》中,我们通过自定义脚本实现了在RPG游戏中的角色控制器,当然这个角色器目前还不完善,为什么这么说呢,我在后面的一篇...
  • 零基础unity3d游戏开发系列目录

    千次阅读 多人点赞 2014-07-10 16:55:51
    零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(一) 零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(二) 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)界面... ...
  • [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

    万次阅读 多人点赞 2014-09-18 00:08:53
    众所周知,Unity3D是一个强大的跨平台游戏引擎,和大多数喜欢Unity的朋友一样,博主在体验了Unity强大的跨平台能力后,被深深地震撼了,试想以前我们如果要开发一款游戏的话,我们需要对DX、OpenGL等图形库

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,678
精华内容 6,671
关键字:

unity3d游戏