精华内容
下载资源
问答
  • Unity3D 如何用3D游戏体播放视频 VideoPlayer

    千次阅读 多人点赞 2020-11-19 13:18:30
    开发者在用Unity3D做工艺仿真、AR或者游戏时,经常要在各种形状的3D游戏体上插播视频充当广告或者教学,那到底怎样实现呢?这就要用到Unity内置的视频播放组件 —— VideoPlayer。 Unity官方网址:...

    如何用3D游戏体播放视频?

    开发者在用Unity3D做工艺仿真、AR或者游戏时,经常要在各种形状的3D游戏体上插播视频充当广告或者教学,那到底怎样实现呢?这就要用到Unity内置的视频播放组件 —— VideoPlayer

    Unity官方网址:https://docs.unity3d.com/Manual/class-VideoPlayer.html

    Demo效果展示

    先上视频看看效果(从左至右,依次是平面、球体、曲面、圆柱):

    如何在3D物体表面播放视频?

    如何在3D物体表面播放视频

    首先创建GameObject ,在GameObject 上添加VideoPlayer 组件:在这里插入图片描述
    然后可以看到,Source 中两个选项,我目前用的是VideoClip。
    1.VideoClip :可以直接拖入Project视图中的视频
    2.URL : 可以放入视频的存储路径

    然后下面还有一个选项值得一提,RenderMode(渲染模式)。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类。所以这里我们是想在3D物体上播放视频,所以选择MaterialOverride。

    勾选play on awake,运行,就可以看到视频在模型上播放了。

    在这里插入图片描述

    如何代码控制VideoPlayer

    1.代码控制视频播放、暂停,监听播放结束等

    上面已经完成了视频播放功能,接下来我们通过代码控制视频:
    下面展示一些 视频播放、暂停,监听播放结束等方法

            private VideoPlayer Vp;
            void Awake()
            {
                Vp = GetComponent<VideoPlayer>();
            }
            void Start()
            {
                Vp.loopPointReached += VideoEnd;
    
                Vp.Play();//播放视频
                Vp.Pause();//暂停视频
                Vp.Stop();//停止视频
                Vp.playbackSpeed = 1;//播放速度
            }
            /// <summary>
            /// 监听视频是否播放结束,结束时调用
            /// </summary>
            /// <param name="vp"></param>
            void VideoEnd(VideoPlayer vp)
            {
                Debug.Log("视频播放结束");
                Vp.Play();//重新播放视频
            }
    

    2.如何监测3D游戏体是否在视野内?

    视频一般是有声音的,在做AR项目时,通常会在3D游戏体出界后,关闭该游戏体身上的视频和音效,那么如何监测3D游戏体是否出界呢?
    Unity有一个内置方法,使用的唯一条件是该游戏体身上必须带有Mseh组件,因为它是通过是否渲染该游戏体来判断的。
    下面展示 3D游戏体是否在视野内的监测方法

            //当游戏体第一次出界时调用,该游戏体身上必须带有Mseh组件
            private void OnBecameInvisible()
            {
                StopVideo();
                Debug.Log("出界");
            }
            //当游戏体第一次进入视野时调用,该游戏体身上必须带有Mseh组件
            private void OnBecameVisible()
            {
                OpenVideo();
                Debug.Log("视野内");
            }
    

    注意事项

    1. 可选视频类型:.mp4、mov、.mpg、.mpeg、.avi和.asf
    2. 亲测3D模型使用情况:
      1、视频会在模型的每一个面都播放,比如视频会在正方体6个面分别播放。此外,模型和视频比例不一样的话会有拉伸情况。因此,需要按自己需求让美术做配套的模型和视频。
      2、如果发现视频的中心并不在3D模型的中间,是模型UV的问题,需要美术调整UV,把视频放在模型指定面的中间。

    如何在2D Canvas上播放视频

    在2D界面播放视频和在3D游戏体上播放,原理及代码是一样的,区别是要把Mesh组件换成RawImage,然后VideoPlayer的RenderMode选项选择RenderTexture或者其他选项。
    详情就不说了,网上有很多,可以参考以下网址:
    https://blog.csdn.net/weixin_43367805/article/details/93178830
    https://www.cnblogs.com/0kk470/p/10637034.html

    展开全文
  • 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万...

    原网址

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万左右,凭借价格门槛的优势,以谷歌Cardboard和三星Gear VR为代表的移动VR设备很大可能成为用户量最大的设备,可能占据2016年虚拟现实设备安装量71%的份额,达到2700万。


    最近,一位从事VR游戏研发的开发者在自己的博客中展示了如何用Unity和Cardboard把一款3D游戏变成VR游戏的方法,他在文章最后还表示,你甚至可以用这种方法把游戏转化为AR游戏,或者从头开始做新的VR游戏,以下是Gamelook编译的博文:


    很多的科幻电影都展示了用人类意志控制物体的能力,但到目前为止,这仍旧是一种幻想,目前还没有技术可以实现这一点。在这份新手教学博客中,你可以学到如何用Unity做一款兼但的虚拟现实游戏,配合谷歌Cardboard创造比较简单的VR体验,本文主要讲的是:


    把Cardboard摄像头集成到你的游戏中;调整UI元素以适应VR模式;做VR模式下可以选择的按钮;在游戏运行的时候程序化地把游戏在常规和VR模式下进行切换。


    什么是谷歌Cardboard?


    理论上说,创造VR体验是非常直接的,你在屏幕上展示的并不是一个单独的图片,而是需要2个。因为它们来自位置相隔几英寸距离的两个摄像头,玩家们从左摄像头看到的是左边图像,右边看到的则是右边图像,这就创造了游戏景深。


    此外,再加上一些不错的动态传感器,你可以探测到用户面朝哪个方向。把这些和你所创造的3D世界结合起来的话,就可以获得一个沉浸感很强的游戏体验。在实际情况中,在一个高分辨率的屏幕上展示两个图像需要非常复杂的硬件,还需要可以追踪玩家的头部运动,把所有的功能集成到一个设备商,还要控制其重量,以免让用户戴起来太累。


    然而,随着谷歌Cardboard的出现,每一台智能机都有可能与Cardboard协作,可以用你手机的屏幕与传感器,把它们变成VR设备的一种,而你所需要的,只是一些Cardboard和塑料镜片。


    开始准备


    需要注意的是,你可能大量用到Unity GUI,所以如果从来没有尝试过这个工具,那么最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR游戏,你需要以下工具:


    Unity专业版,版本5以上;一部智能机,可以是iPhone 5代以后的iOS设备,也可以是4.3以上版本的Android设备。需要说的是,本文假设你是在用iPhone获得VR游戏体验。


    如果你从来没有用过Unity而且也不熟悉界面,那最好是去读Unity教程介绍

    可能会有人说,我如何获得一个Cardboard硬件呢?


    当然,如果还没有Cardboard设备的话,最好是从供应商那里选购,价格加运费大约是20-30美元,如果你觉得自己非常善于DIY,也可以动手做自己的版本。在购买Cardboard的时候,要注意提到V2或者Cardboard 2.0的字样,因为它们适配大量的手机,包括大屏幕的iPhone 6+在内,它们还支持用户通过按钮进行输入操作。


    没有Cardboard设备可以吗?


    从某种程度上说,是可以的,你仍然可以在自己的设备上运行做出来的游戏,它看起来会是这样的(下图):

    在玩游戏的时候,如果你用恰当的方式盯着屏幕看,也可以找到VR的感觉。如果你四处移动手机,就可以进行控制。虽然你也可以玩这款游戏,还能够看到游戏的实际效果,但这种体验是比较有限的。


    长话短说,如果你没有足够的耐心等待Cardboard到货,你仍然可以从本文中学到东西,只是,如果有合适的设备,你能够学的东西更多。


    样本游戏:Ninja Attack is Back!


    投入一些时间尝试这个样本游戏,下载并解压这个Unity新手项目。接下来就是运行Unity,在欢迎界面,选择打开(Open)-找到StarterNinja文件夹,打开NinjaAttack项目。


    在项目浏览器(Project Browser)中,在Assets里双击MainScene按钮,然后点击Play尝试一下这款游戏。在图片中,你是左边的忍者,随着怪兽在屏幕中出现,你可以在屏幕上点击任何地方释放一个忍者之星消灭怪兽,在击杀20个怪兽之后,你就赢了,但是,如果怪兽到达了左边的红色区域,你就输了。

    这款游戏看起来很熟悉是吗?熟悉的读者可能会发现,它其实就是我之前介绍SpriteKit以及Cocos2D教程用到的游戏,不过与之不同的是,这里的游戏是用3D渲染的。当然,你并不一定能够真正地看到非常酷炫的3D效果,这款游戏使用的是上帝视角,所以对所有的polygon进行渲染总觉得浪费时间,所以,你现在可以发现为什么这款游戏非常适合做成VR了。


    开始使用Cardboard


    你需要做的第一件事就是为Unity下载Cardboard SDK。接下来,把它导入到你的项目中。从Unity的主菜单,选择Assets\Import Package\Custom Package,然后选择你刚刚下载的CardboardSDKForUnity.unitypackage。确保所有东西都被选中,反选Legacy文件夹,然后点击Import按钮。

    为了让你的游戏作为一个VR体验,你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs文件夹里,把CardboardMain Prefab拖拽到你的场景中,在Inspector中,给其赋予和你的忍者角色一样的位置(5.53,1.13,0.122),并且要进行90度Y Rotation。


    你会发现的是,它比忍者的中心部位略高,这样可以展现出你在看他的眼睛。

    接下来,选择主摄像头(Main Camera)并且在Inspector中反选,做raccoon忍者对象的时候也需要同样的操作。现在,把游戏在Unity编辑器中再次运行,你就会看到一些类似于3D场景的东西。如果你在移动鼠标的时候按住选择键,你的摄像头就会随着头部的运动进行旋转。

    在iOS设备上运行你的游戏场景


    在Unity编辑器中运行你的游戏是非常不错的,但最后一次检查的时候,用VR头盔配上电脑显示器看起来会让人很痛苦,所以我们需要适配到iPhone上。

    选择File\Build Settings,iOS应该已经被选为你的默认平台,点击Click Player Settings然后转换到Inspector。


    在Resolution and Presentation菜单下,把Default Orientation设置成Landscape Left。


    在其他设置(Other Settings)中,把Bundle Identifier改成你的公司所需要的东西,比如com.(你的公司名).NinjaAttackVR。


    把目标设备改为iPhone,把iPhone和电脑进行连接,选择Build和Run,然后给输出文件夹命名,这个名字你可以随意取。

    这时候,Unity就会导出你的项目,然后它就会自动在Xcode中打开,如果没有打开,启动Xcode并且手动打开生成后的项目,运行然后在手机上尝试。首次运行游戏的时候,你需要一系列的设置过程,比如可以在Cardboard硬件上扫描二维码,这样Cardboard SDK就可以根据你的设备、距离等进行画质微调。


    需要注意的是,如果设置过程中,你在扫描二维码的时候出现了 网址打开错误,那就必须调整Xcode项目中的info.plist,苹果开发者论坛中有说到这个问题,感兴趣的童鞋可以亲自查阅。

    接着,把你的手机插入Cardboard当中,来回转头以调整摄像头视角,你就可以看到相对不错的3D画面了。


    再一次把它做成游戏


    能够看到你的游戏世界是非常不错的,但初次之外,你还需要把玩法加入到游戏中,特别是你需要从忍者面朝的方向扔出忍者之星,这是你将要做的第一个玩法。


    对于UI来说,Cardboard支持一个按钮,看起来可能是比较有限,但如果把它和头部的动态追踪相结合的话,它可以做出更为复杂的互动。在《Ninja Attack》中,你通过Cardboard.SDK.VRModeEnable资源侦测玩家是否开始了VR模式,检查按钮是否和Cardboard.SDK.Triggered资源同时按下去了,如果这些值都对,就可以在用户面朝的方向扔出忍者之星。


    打开你的NinjaStarLauncher.cs脚本,你会发现它在Inspector里是和GameLogic GameObject连在一起的。


    创造一个新的private变量:


    private Vector3 _vrShooterOffset;


    把它在Start() method中初始化:


    _vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);


    用以下代码替换Update ():

    这就可以运行了,接下来我们看看Update()是做什么的:


    你首先检查游戏是否在VR模式,用户是否按下了按钮检查Cardboard.SDK singleton object上的资源。


    在此之后,你可以调用LaunchNinjaStarFrom()释放一个忍者之星,你需要用到两个parameter:


    第一个是GameObject头文件,Cardboard库会为你调出来,所以它应该是已经指向了正确的位置;第二个是轻微偏移,这样你面前的忍者之星就会看起来更真实,否则的话你扔出去的忍者之星就像是在四只眼之间进行运动,虽然看起来很cool,但给人的感觉很奇怪。


    由于你的Ninja Star GameObject已经被设计飞往特定方向,所以它会朝着正确的方向进攻。


    再试一次,这时候,你可以转头扔向坏人,输赢logic仍旧起作用。

    解决Game Over菜单


    你可能已经注意到了,当游戏结束的时候,用之前的Game Over按钮,你的角色仍旧是在屏幕的左边。这款游戏用到了Display Canvas来展示Game Over界面,Unity最新的GUI教程中有讲到这一点,它总是出现在游戏窗口的顶部。这个标签适用于大多数的游戏GUI,因为它可以自动适应到你屏幕的上方,不论你的摄像头在做什么,而且它可以非常不错地适应不同屏幕尺寸。

    但在这个案例中,你需要一个存在于游戏世界中的GUI canvas,有一部分原因是它可以在3D环境中更好渲染,但还因为不希望把玩家爱是叫锁定到摄像头上。你的玩家们需要可以上下自由地看,这样他们可以看到不同的UI元素,找到最活跃的然后点击按钮。


    创造一个新的Canvas


    在Hierarchy菜单下选择GameOverCanvas,右击并且选择复制,重命名为VRGameOverCanvas,这样可以使它与原来的进行区别开来,把GameOverTxt重命名为VRGameOvertxt。

    在VRGameOverCanvas组件中,把渲染模式改为World Space。


    在Rect Transform组件中,把位置改为(-2.24,1.1,0.07),然后进行90度Y Rotation

    最后,把X和Y Scale改为0.009,当所有一切完成的时候,VRGameOverCanvas看起来因该是这样的:


    你可以在Game View视角下看到两个canvas是大致重叠的(当游戏不运行的时候):

    这些值是哪里来的呢?坦白地说,我其实是调整到自己通过Cardboard摄像头看起来比较不错为止。有时候,编程更多的是一门艺术而不是学科。


    支持两个Canvas


    接下来,你需要更改GameController.cs,这样它才会发现两个Canvas打开和GameLogic GameObject脚本,它也是和GameLogic GameObject联系在一起的。把以下的两个公共变量加入到你的class里:


    public Canvas VRGameOverCanvas;
    public Text VRGameOverTxt;


    在resetGame()的开始加入如下代码:


    VRGameOverCanvas.enabled = false;


    用以下代码取代Gameover():


    public void GameOver(bool didIWin) {
    isGameOver = true;
    _didIWin = didIWin;
    string finalTxt = (_didIWin) ? “You won!” : “Too bad”;
    if (Cardboard.SDK.VRModeEnabled) {
    VRGameOverCanvas.enabled = true;
    VRGameOverTxt.text = finalTxt;
    } else {
    gameOverCanvas.enabled = true;
    gameOverTxt.text = finalTxt;
    }
    }


    这个展示了正确的Canvas和Text对象,取决于你是否在VR模式(开启Cardboard.SDK.VRMode).

    在你保存了脚本之后,你需要把正确的对象分配到新的公用变量。在Inspector里找到GameController,点击每个新变量旁边的目标,然后选择VRGameOverCanvas对象作为你的VR游戏Over Over Canvas变量,把VRGameOverTxt对象选为你的VR Game Over Txt变量。


    需要注意的是,可能你会奇怪,为什么是很麻烦地支持两个Canvas而不是至改变现有的一个呢?原因是,你既需要支持上帝视角,还需要支持VR模式,所以一定要进行优化。


    如果你准备现在就运行游戏,就可以发现VR模式里的游戏结束界面展示的很自然。你可以上下看界面的不同部分,现在所有缺少的东西就是再来一次的按钮。

    增加Gaze输入方式


    幸运的是,Unity内置了‘在使用world-space GUI Canvas的时候,摄像头中心点可以作为鼠标使用’,但你需要提供额外的脚本才能使它在VR界面中进行使用。

    首先,扩展Cardboard Main\Head,找到主摄像头并把它重命名为VR Main Camera。选中VRGameOverCanvas对象,你们应该可以看到一个事件摄像头,点击Hierarchy里的EventSystem项目,点击增加组件按钮,并增加GazeInpute Module脚本。这个脚本可以确保Unity的GUI系统了解Cardboard摄像头的工作方式。


    检查VR Mode Only,因为在VR模式下的时候,只需要这么运行就可以了。最后,点击你刚刚增加的Gaze Input Module Component,然后选择Move Up,重复一次,确保它可以出现在触屏输入和独立输入模式中,这可以确保Gaze Input Module在游戏进行的同时优先选择输入方式。当所有都做好的时候,它看起来应该是这样的:

    现在,你就可以进行尝试了。这一次,当你把视角放到Play Again按钮的时候,它就会变绿,让你重新开始一场新的游戏。

    玩法微调


    或许你会发现这个版本的游戏在VR模式下玩起来有点难,这是因为你的视角是缩水的,所以在你看着错误的方向时,敌人很容易从你身边溜过去。而且,你无法迅速改变瞄准方向,你会因为脖子转速的限制而影响到游戏操作。你让玩家体验VR模式并不是为了惩罚他们,所以,你该如何调整呢?当然,可能会有人建议把敌人速度降低。


    在Prefabs文件夹中选中EvilSlimeEnemy Prefab,然后打开EnemyMover.cs,把以下代码增加到Start(),随后设置速度:


    这会让你的游戏在VR模式下变得更简单,所以玩家们不至于因为选择了VR模式就获得糟糕体验。


    解决屏幕上的分数显示问题


    你还需要解决的一个UI问题是屏幕上的分数,这个就需要不同的方式来处理了。虽然它仍然需要在VR模式中恰当的被显示出来,但你更希望它在你看任何方向的时候都固定在摄像头上。


    选中Cardboard Main\Head,右击并选择UI\Canvas,重命名新的canvas为VRScoreCanvas,把渲染模式调整为World Space,为其赋予以下值:


    位置(0,1,2.5)、宽度400、高度100、旋转(0,0,0)、Scale(0.0115,0.0115,1)。当完成之后,游戏看起来该是这样的:

    看起来可能你的文本很奇怪地放在了屏幕中央,但在VR模式里,你能够看到的世界比正常情况下是少很多的,所以你在游戏中看到分数的时候应该是在边缘部位的,你可以自由进行位置调整,以使其适应你的手机。


    接下来,使用文本对象展示你的分数,这个过程和Game Over的做法类似。

    打开GameController.cs并增加一个新的公用变量:


    public Text VRScoreTxt;


    接下来,你每次更新scoreTxt的时候都需要更新VRScoreTxt,在ResetGame() method中,把以下代码加在每次更新后的scoreTxt之后:


    VRScoreTxt.text = “–“;


    然后把这行代码增加到GotOne(),也放在更新scoreTxt的后面:


    VRScoreTxt.text = “” + _currScore;


    保存你的脚本,回到Unity,然后你会发现GameLogic当中的GameController Component如今可以输入VR Score Txt变量了,点击临近的目标然后选择你的VRScoreTxt文本对象。

    再次体验你的游戏,现在,你就可以看到分数出现在左上角了,还可以允许你的头部进行运动。


    VR模式的切换


    由于你的游戏同时支持上帝视角和VR模式,你应该给用户自由切换的选择,UI做起来是很直观的,你只需要在上帝视角模式中加入一个简单的按钮,让玩家们来回切换模式即可。


    首先,你需要增加切换的代码,选择Hierarchy里的GameLogic,点击增加组件,选择新脚本(New Script)然后把脚本命名为CardboardSwapper。
    打开并用以下内容替换class代码:

    这个class里最重要的method就是ActiveVRMode,它是用来激活Cardboard的VR模式的。其余的logic负责控制场景中的多个GameObject,取决于是否处于VR模式,你在上帝视角是看不到某些东西的。


    你还可以发现的是,当你侦测后面按钮的时候调用了Switch(),这个功能非常适合测试。


    你还需要为GameController脚本增加更多的logic,这样它才能在切换模式的时候展示或者隐藏一些东西,打开GameController.cs,把这个method加进去:


    public void RefreshGameOver() {
    gameOverCanvas.enabled = false;
    VRGameOverCanvas.enabled = false;
    if (isGameOver) {
    GameOver(_didIWin);
    }
    }


    保存一切然后重新回到Unity界面,选择GameLogic然后向下滚动到Cardboard Swapper组件,对于Cardboard Object数列,把它的大小赋值为1,然后放到场景中的CardboardMain GameObject中。这样不仅可以禁用你的Cardboard Head让你回到上帝视角摄像头模式,还可以禁用VRScoreCanvas。


    对于Mono Object数列,把它的大小赋值为3,然后为你的场景选择Canvas、Main Camera和raccoon ninja,不要从Assets里选择。


    最后你需要在上帝视角canvas为用户增加一个按钮,为了节约时间,我已经把它做好了,位于prefabs文件夹中。


    从Assets\Prefabs中把CardboardButton推拽到Hierarchy,这样它就成为了你的Canvas对象的子对象,确保其位置设定是(-50,50,0):


    在你的按钮对象底部,把它们连接起来,这样点击按钮的时候就可以调用CardboardSwapper.Switch() method,你可以从这个动画看看是如何做出来的:

    再次尝试你的游戏,点击屏幕右下方的按钮切换至VR模式,然后单机Cardboard界面背后的按钮切换到上帝视角模式。做到这里,你的VR模式切换就已经完成了。

    现在,你可以把Unity中的任何3D游戏做成VR游戏了,而且只需要一个Cardboard和一些塑料镜片,这是可以让所有人都能够体验的VR游戏。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南还提供了更多的技术信息。最后,你甚至可以为你的VR游戏增加AR功能。


    最后,你可以尝试Unity里所有的3D游戏,看是否能够顺利地做成VR体验,或者,这个教程也可以让你做出全新的VR游戏。

    展开全文
  • 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万...

    原网址

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万左右,凭借价格门槛的优势,以谷歌Cardboard和三星Gear VR为代表的移动VR设备很大可能成为用户量最大的设备,可能占据2016年虚拟现实设备安装量71%的份额,达到2700万。


    最近,一位从事VR游戏研发的开发者在自己的博客中展示了如何用Unity和Cardboard把一款3D游戏变成VR游戏的方法,他在文章最后还表示,你甚至可以用这种方法把游戏转化为AR游戏,或者从头开始做新的VR游戏,以下是Gamelook编译的博文:


    很多的科幻电影都展示了用人类意志控制物体的能力,但到目前为止,这仍旧是一种幻想,目前还没有技术可以实现这一点。在这份新手教学博客中,你可以学到如何用Unity做一款兼但的虚拟现实游戏,配合谷歌Cardboard创造比较简单的VR体验,本文主要讲的是:


    把Cardboard摄像头集成到你的游戏中;调整UI元素以适应VR模式;做VR模式下可以选择的按钮;在游戏运行的时候程序化地把游戏在常规和VR模式下进行切换。


    什么是谷歌Cardboard?


    理论上说,创造VR体验是非常直接的,你在屏幕上展示的并不是一个单独的图片,而是需要2个。因为它们来自位置相隔几英寸距离的两个摄像头,玩家们从左摄像头看到的是左边图像,右边看到的则是右边图像,这就创造了游戏景深。


    此外,再加上一些不错的动态传感器,你可以探测到用户面朝哪个方向。把这些和你所创造的3D世界结合起来的话,就可以获得一个沉浸感很强的游戏体验。在实际情况中,在一个高分辨率的屏幕上展示两个图像需要非常复杂的硬件,还需要可以追踪玩家的头部运动,把所有的功能集成到一个设备商,还要控制其重量,以免让用户戴起来太累。


    然而,随着谷歌Cardboard的出现,每一台智能机都有可能与Cardboard协作,可以用你手机的屏幕与传感器,把它们变成VR设备的一种,而你所需要的,只是一些Cardboard和塑料镜片。


    开始准备


    需要注意的是,你可能大量用到Unity GUI,所以如果从来没有尝试过这个工具,那么最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR游戏,你需要以下工具:


    Unity专业版,版本5以上;一部智能机,可以是iPhone 5代以后的iOS设备,也可以是4.3以上版本的Android设备。需要说的是,本文假设你是在用iPhone获得VR游戏体验。


    如果你从来没有用过Unity而且也不熟悉界面,那最好是去读Unity教程介绍

    可能会有人说,我如何获得一个Cardboard硬件呢?


    当然,如果还没有Cardboard设备的话,最好是从供应商那里选购,价格加运费大约是20-30美元,如果你觉得自己非常善于DIY,也可以动手做自己的版本。在购买Cardboard的时候,要注意提到V2或者Cardboard 2.0的字样,因为它们适配大量的手机,包括大屏幕的iPhone 6+在内,它们还支持用户通过按钮进行输入操作。


    没有Cardboard设备可以吗?


    从某种程度上说,是可以的,你仍然可以在自己的设备上运行做出来的游戏,它看起来会是这样的(下图):

    在玩游戏的时候,如果你用恰当的方式盯着屏幕看,也可以找到VR的感觉。如果你四处移动手机,就可以进行控制。虽然你也可以玩这款游戏,还能够看到游戏的实际效果,但这种体验是比较有限的。


    长话短说,如果你没有足够的耐心等待Cardboard到货,你仍然可以从本文中学到东西,只是,如果有合适的设备,你能够学的东西更多。


    样本游戏:Ninja Attack is Back!


    投入一些时间尝试这个样本游戏,下载并解压这个Unity新手项目。接下来就是运行Unity,在欢迎界面,选择打开(Open)-找到StarterNinja文件夹,打开NinjaAttack项目。


    在项目浏览器(Project Browser)中,在Assets里双击MainScene按钮,然后点击Play尝试一下这款游戏。在图片中,你是左边的忍者,随着怪兽在屏幕中出现,你可以在屏幕上点击任何地方释放一个忍者之星消灭怪兽,在击杀20个怪兽之后,你就赢了,但是,如果怪兽到达了左边的红色区域,你就输了。

    这款游戏看起来很熟悉是吗?熟悉的读者可能会发现,它其实就是我之前介绍SpriteKit以及Cocos2D教程用到的游戏,不过与之不同的是,这里的游戏是用3D渲染的。当然,你并不一定能够真正地看到非常酷炫的3D效果,这款游戏使用的是上帝视角,所以对所有的polygon进行渲染总觉得浪费时间,所以,你现在可以发现为什么这款游戏非常适合做成VR了。


    开始使用Cardboard


    你需要做的第一件事就是为Unity下载Cardboard SDK。接下来,把它导入到你的项目中。从Unity的主菜单,选择Assets\Import Package\Custom Package,然后选择你刚刚下载的CardboardSDKForUnity.unitypackage。确保所有东西都被选中,反选Legacy文件夹,然后点击Import按钮。

    为了让你的游戏作为一个VR体验,你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs文件夹里,把CardboardMain Prefab拖拽到你的场景中,在Inspector中,给其赋予和你的忍者角色一样的位置(5.53,1.13,0.122),并且要进行90度Y Rotation。


    你会发现的是,它比忍者的中心部位略高,这样可以展现出你在看他的眼睛。

    接下来,选择主摄像头(Main Camera)并且在Inspector中反选,做raccoon忍者对象的时候也需要同样的操作。现在,把游戏在Unity编辑器中再次运行,你就会看到一些类似于3D场景的东西。如果你在移动鼠标的时候按住选择键,你的摄像头就会随着头部的运动进行旋转。

    在iOS设备上运行你的游戏场景


    在Unity编辑器中运行你的游戏是非常不错的,但最后一次检查的时候,用VR头盔配上电脑显示器看起来会让人很痛苦,所以我们需要适配到iPhone上。

    选择File\Build Settings,iOS应该已经被选为你的默认平台,点击Click Player Settings然后转换到Inspector。


    在Resolution and Presentation菜单下,把Default Orientation设置成Landscape Left。


    在其他设置(Other Settings)中,把Bundle Identifier改成你的公司所需要的东西,比如com.(你的公司名).NinjaAttackVR。


    把目标设备改为iPhone,把iPhone和电脑进行连接,选择Build和Run,然后给输出文件夹命名,这个名字你可以随意取。

    这时候,Unity就会导出你的项目,然后它就会自动在Xcode中打开,如果没有打开,启动Xcode并且手动打开生成后的项目,运行然后在手机上尝试。首次运行游戏的时候,你需要一系列的设置过程,比如可以在Cardboard硬件上扫描二维码,这样Cardboard SDK就可以根据你的设备、距离等进行画质微调。


    需要注意的是,如果设置过程中,你在扫描二维码的时候出现了 网址打开错误,那就必须调整Xcode项目中的info.plist,苹果开发者论坛中有说到这个问题,感兴趣的童鞋可以亲自查阅。

    接着,把你的手机插入Cardboard当中,来回转头以调整摄像头视角,你就可以看到相对不错的3D画面了。


    再一次把它做成游戏


    能够看到你的游戏世界是非常不错的,但初次之外,你还需要把玩法加入到游戏中,特别是你需要从忍者面朝的方向扔出忍者之星,这是你将要做的第一个玩法。


    对于UI来说,Cardboard支持一个按钮,看起来可能是比较有限,但如果把它和头部的动态追踪相结合的话,它可以做出更为复杂的互动。在《Ninja Attack》中,你通过Cardboard.SDK.VRModeEnable资源侦测玩家是否开始了VR模式,检查按钮是否和Cardboard.SDK.Triggered资源同时按下去了,如果这些值都对,就可以在用户面朝的方向扔出忍者之星。


    打开你的NinjaStarLauncher.cs脚本,你会发现它在Inspector里是和GameLogic GameObject连在一起的。


    创造一个新的private变量:


    private Vector3 _vrShooterOffset;


    把它在Start() method中初始化:


    _vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);


    用以下代码替换Update ():

    这就可以运行了,接下来我们看看Update()是做什么的:


    你首先检查游戏是否在VR模式,用户是否按下了按钮检查Cardboard.SDK singleton object上的资源。


    在此之后,你可以调用LaunchNinjaStarFrom()释放一个忍者之星,你需要用到两个parameter:


    第一个是GameObject头文件,Cardboard库会为你调出来,所以它应该是已经指向了正确的位置;第二个是轻微偏移,这样你面前的忍者之星就会看起来更真实,否则的话你扔出去的忍者之星就像是在四只眼之间进行运动,虽然看起来很cool,但给人的感觉很奇怪。


    由于你的Ninja Star GameObject已经被设计飞往特定方向,所以它会朝着正确的方向进攻。


    再试一次,这时候,你可以转头扔向坏人,输赢logic仍旧起作用。

    解决Game Over菜单


    你可能已经注意到了,当游戏结束的时候,用之前的Game Over按钮,你的角色仍旧是在屏幕的左边。这款游戏用到了Display Canvas来展示Game Over界面,Unity最新的GUI教程中有讲到这一点,它总是出现在游戏窗口的顶部。这个标签适用于大多数的游戏GUI,因为它可以自动适应到你屏幕的上方,不论你的摄像头在做什么,而且它可以非常不错地适应不同屏幕尺寸。

    但在这个案例中,你需要一个存在于游戏世界中的GUI canvas,有一部分原因是它可以在3D环境中更好渲染,但还因为不希望把玩家爱是叫锁定到摄像头上。你的玩家们需要可以上下自由地看,这样他们可以看到不同的UI元素,找到最活跃的然后点击按钮。


    创造一个新的Canvas


    在Hierarchy菜单下选择GameOverCanvas,右击并且选择复制,重命名为VRGameOverCanvas,这样可以使它与原来的进行区别开来,把GameOverTxt重命名为VRGameOvertxt。

    在VRGameOverCanvas组件中,把渲染模式改为World Space。


    在Rect Transform组件中,把位置改为(-2.24,1.1,0.07),然后进行90度Y Rotation

    最后,把X和Y Scale改为0.009,当所有一切完成的时候,VRGameOverCanvas看起来因该是这样的:


    你可以在Game View视角下看到两个canvas是大致重叠的(当游戏不运行的时候):

    这些值是哪里来的呢?坦白地说,我其实是调整到自己通过Cardboard摄像头看起来比较不错为止。有时候,编程更多的是一门艺术而不是学科。


    支持两个Canvas


    接下来,你需要更改GameController.cs,这样它才会发现两个Canvas打开和GameLogic GameObject脚本,它也是和GameLogic GameObject联系在一起的。把以下的两个公共变量加入到你的class里:


    public Canvas VRGameOverCanvas;
    public Text VRGameOverTxt;


    在resetGame()的开始加入如下代码:


    VRGameOverCanvas.enabled = false;


    用以下代码取代Gameover():


    public void GameOver(bool didIWin) {
    isGameOver = true;
    _didIWin = didIWin;
    string finalTxt = (_didIWin) ? “You won!” : “Too bad”;
    if (Cardboard.SDK.VRModeEnabled) {
    VRGameOverCanvas.enabled = true;
    VRGameOverTxt.text = finalTxt;
    } else {
    gameOverCanvas.enabled = true;
    gameOverTxt.text = finalTxt;
    }
    }


    这个展示了正确的Canvas和Text对象,取决于你是否在VR模式(开启Cardboard.SDK.VRMode).

    在你保存了脚本之后,你需要把正确的对象分配到新的公用变量。在Inspector里找到GameController,点击每个新变量旁边的目标,然后选择VRGameOverCanvas对象作为你的VR游戏Over Over Canvas变量,把VRGameOverTxt对象选为你的VR Game Over Txt变量。


    需要注意的是,可能你会奇怪,为什么是很麻烦地支持两个Canvas而不是至改变现有的一个呢?原因是,你既需要支持上帝视角,还需要支持VR模式,所以一定要进行优化。


    如果你准备现在就运行游戏,就可以发现VR模式里的游戏结束界面展示的很自然。你可以上下看界面的不同部分,现在所有缺少的东西就是再来一次的按钮。

    增加Gaze输入方式


    幸运的是,Unity内置了‘在使用world-space GUI Canvas的时候,摄像头中心点可以作为鼠标使用’,但你需要提供额外的脚本才能使它在VR界面中进行使用。

    首先,扩展Cardboard Main\Head,找到主摄像头并把它重命名为VR Main Camera。选中VRGameOverCanvas对象,你们应该可以看到一个事件摄像头,点击Hierarchy里的EventSystem项目,点击增加组件按钮,并增加GazeInpute Module脚本。这个脚本可以确保Unity的GUI系统了解Cardboard摄像头的工作方式。


    检查VR Mode Only,因为在VR模式下的时候,只需要这么运行就可以了。最后,点击你刚刚增加的Gaze Input Module Component,然后选择Move Up,重复一次,确保它可以出现在触屏输入和独立输入模式中,这可以确保Gaze Input Module在游戏进行的同时优先选择输入方式。当所有都做好的时候,它看起来应该是这样的:

    现在,你就可以进行尝试了。这一次,当你把视角放到Play Again按钮的时候,它就会变绿,让你重新开始一场新的游戏。

    玩法微调


    或许你会发现这个版本的游戏在VR模式下玩起来有点难,这是因为你的视角是缩水的,所以在你看着错误的方向时,敌人很容易从你身边溜过去。而且,你无法迅速改变瞄准方向,你会因为脖子转速的限制而影响到游戏操作。你让玩家体验VR模式并不是为了惩罚他们,所以,你该如何调整呢?当然,可能会有人建议把敌人速度降低。


    在Prefabs文件夹中选中EvilSlimeEnemy Prefab,然后打开EnemyMover.cs,把以下代码增加到Start(),随后设置速度:


    这会让你的游戏在VR模式下变得更简单,所以玩家们不至于因为选择了VR模式就获得糟糕体验。


    解决屏幕上的分数显示问题


    你还需要解决的一个UI问题是屏幕上的分数,这个就需要不同的方式来处理了。虽然它仍然需要在VR模式中恰当的被显示出来,但你更希望它在你看任何方向的时候都固定在摄像头上。


    选中Cardboard Main\Head,右击并选择UI\Canvas,重命名新的canvas为VRScoreCanvas,把渲染模式调整为World Space,为其赋予以下值:


    位置(0,1,2.5)、宽度400、高度100、旋转(0,0,0)、Scale(0.0115,0.0115,1)。当完成之后,游戏看起来该是这样的:

    看起来可能你的文本很奇怪地放在了屏幕中央,但在VR模式里,你能够看到的世界比正常情况下是少很多的,所以你在游戏中看到分数的时候应该是在边缘部位的,你可以自由进行位置调整,以使其适应你的手机。


    接下来,使用文本对象展示你的分数,这个过程和Game Over的做法类似。

    打开GameController.cs并增加一个新的公用变量:


    public Text VRScoreTxt;


    接下来,你每次更新scoreTxt的时候都需要更新VRScoreTxt,在ResetGame() method中,把以下代码加在每次更新后的scoreTxt之后:


    VRScoreTxt.text = “–“;


    然后把这行代码增加到GotOne(),也放在更新scoreTxt的后面:


    VRScoreTxt.text = “” + _currScore;


    保存你的脚本,回到Unity,然后你会发现GameLogic当中的GameController Component如今可以输入VR Score Txt变量了,点击临近的目标然后选择你的VRScoreTxt文本对象。

    再次体验你的游戏,现在,你就可以看到分数出现在左上角了,还可以允许你的头部进行运动。


    VR模式的切换


    由于你的游戏同时支持上帝视角和VR模式,你应该给用户自由切换的选择,UI做起来是很直观的,你只需要在上帝视角模式中加入一个简单的按钮,让玩家们来回切换模式即可。


    首先,你需要增加切换的代码,选择Hierarchy里的GameLogic,点击增加组件,选择新脚本(New Script)然后把脚本命名为CardboardSwapper。
    打开并用以下内容替换class代码:

    这个class里最重要的method就是ActiveVRMode,它是用来激活Cardboard的VR模式的。其余的logic负责控制场景中的多个GameObject,取决于是否处于VR模式,你在上帝视角是看不到某些东西的。


    你还可以发现的是,当你侦测后面按钮的时候调用了Switch(),这个功能非常适合测试。


    你还需要为GameController脚本增加更多的logic,这样它才能在切换模式的时候展示或者隐藏一些东西,打开GameController.cs,把这个method加进去:


    public void RefreshGameOver() {
    gameOverCanvas.enabled = false;
    VRGameOverCanvas.enabled = false;
    if (isGameOver) {
    GameOver(_didIWin);
    }
    }


    保存一切然后重新回到Unity界面,选择GameLogic然后向下滚动到Cardboard Swapper组件,对于Cardboard Object数列,把它的大小赋值为1,然后放到场景中的CardboardMain GameObject中。这样不仅可以禁用你的Cardboard Head让你回到上帝视角摄像头模式,还可以禁用VRScoreCanvas。


    对于Mono Object数列,把它的大小赋值为3,然后为你的场景选择Canvas、Main Camera和raccoon ninja,不要从Assets里选择。


    最后你需要在上帝视角canvas为用户增加一个按钮,为了节约时间,我已经把它做好了,位于prefabs文件夹中。


    从Assets\Prefabs中把CardboardButton推拽到Hierarchy,这样它就成为了你的Canvas对象的子对象,确保其位置设定是(-50,50,0):


    在你的按钮对象底部,把它们连接起来,这样点击按钮的时候就可以调用CardboardSwapper.Switch() method,你可以从这个动画看看是如何做出来的:

    再次尝试你的游戏,点击屏幕右下方的按钮切换至VR模式,然后单机Cardboard界面背后的按钮切换到上帝视角模式。做到这里,你的VR模式切换就已经完成了。

    现在,你可以把Unity中的任何3D游戏做成VR游戏了,而且只需要一个Cardboard和一些塑料镜片,这是可以让所有人都能够体验的VR游戏。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南还提供了更多的技术信息。最后,你甚至可以为你的VR游戏增加AR功能。


    最后,你可以尝试Unity里所有的3D游戏,看是否能够顺利地做成VR体验,或者,这个教程也可以让你做出全新的VR游戏。


    展开全文
  • 今天我们来点简单的东西... 好了,欣赏完美丽的风景,下面我们就来一起学习在Unity3D实现截屏,先给出实现截屏的三种实现方式: [csharp] view plaincopyprint? /// /// 使用Application类下的CaptureScr


           欢迎来到企业培训教育专区,这里有很多我们致力于打造业内培训、学习第一品牌

    今天我们来做点简单的东西,做个什么呢?答案就是截屏。如图,下面是收集的部分截图:


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

    [csharp] view plaincopyprint?

    1. /// <summary>  
    2.     /// 使用Application类下的CaptureScreenshot()方法实现截图  
    3.     /// 优点:简单,可以快速地截取某一帧的画面、全屏截图  
    4.     /// 缺点:不能针对摄像机截图,无法进行局部截图  
    5.     /// </summary>  
    6.     /// <param name="mFileName">M file name.</param>  
    7.     private void CaptureByUnity(string mFileName)  
    8.     {  
    9.         Application.CaptureScreenshot(mFileName,0);  
    10.     }  
    11.   
    12.     /// <summary>  
    13.     /// 根据一个Rect类型来截取指定范围的屏幕  
    14.     /// 左下角为(0,0)  
    15.     /// </summary>  
    16.     /// <param name="mRect">M rect.</param>  
    17.     /// <param name="mFileName">M file name.</param>  
    18.     private IEnumerator CaptureByRect(Rect mRect,string mFileName)  
    19.     {  
    20.         //等待渲染线程结束  
    21.         yield return new WaitForEndOfFrame();  
    22.         //初始化Texture2D  
    23.         Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);  
    24.         //读取屏幕像素信息并存储为纹理数据  
    25.         mTexture.ReadPixels(mRect,0,0);  
    26.         //应用  
    27.         mTexture.Apply();  
    28.           
    29.           
    30.         //将图片信息编码为字节信息  
    31.         byte[] bytes = mTexture.EncodeToPNG();    
    32.         //保存  
    33.         System.IO.File.WriteAllBytes(mFileName, bytes);  
    34.           
    35.         //如果需要可以返回截图  
    36.         //return mTexture;  
    37.     }  
    38.   
    39.     private IEnumerator  CaptureByCamera(Camera mCamera,Rect mRect,string mFileName)  
    40.     {  
    41.         //等待渲染线程结束  
    42.         yield return new WaitForEndOfFrame();  
    43.   
    44.         //初始化RenderTexture  
    45.         RenderTexture mRender=new RenderTexture((int)mRect.width,(int)mRect.height,0);  
    46.         //设置相机的渲染目标  
    47.         mCamera.targetTexture=mRender;  
    48.         //开始渲染  
    49.         mCamera.Render();  
    50.           
    51.         //激活渲染贴图读取信息  
    52.         RenderTexture.active=mRender;  
    53.           
    54.         Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);  
    55.         //读取屏幕像素信息并存储为纹理数据  
    56.         mTexture.ReadPixels(mRect,0,0);  
    57.         //应用  
    58.         mTexture.Apply();  
    59.           
    60.         //释放相机,销毁渲染贴图  
    61.         mCamera.targetTexture = null;     
    62.         RenderTexture.active = null;   
    63.         GameObject.Destroy(mRender);    
    64.           
    65.         //将图片信息编码为字节信息  
    66.         byte[] bytes = mTexture.EncodeToPNG();    
    67.         //保存  
    68.         System.IO.File.WriteAllBytes(mFileName,bytes);  
    69.           
    70.         //如果需要可以返回截图  
    71.         //return mTexture;  
    72.     }  
    73.   
    74. }  

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

    1. //定义图片保存路径  
    2.     private string mPath1;  
    3.     private string mPath2;  
    4.     private string mPath3;  
    5.   
    6.     //相机  
    7.     public Transform CameraTrans;  
    8.   
    9.     void Start()  
    10.     {  
    11.         //初始化路径  
    12.         mPath1=Application.dataPath+"\\ScreenShot\\ScreenShot1.png";  
    13.         mPath2=Application.dataPath+"\\ScreenShot\\ScreenShot2.png";  
    14.         mPath3=Application.dataPath+"\\ScreenShot\\ScreenShot3.png";  
    15.     }  
    16.   
    17.     //主方法,使用UGUI实现  
    18.     void OnGUI()  
    19.     {  
    20.         if(GUILayout.Button("截图方式1",GUILayout.Height(30))){  
    21.             CaptureByUnity(mPath1);  
    22.         }  
    23.         if(GUILayout.Button("截图方式2",GUILayout.Height(30))){  
    24.             StartCoroutine(CaptureByRect(new Rect(0,0,1024,768),mPath2));  
    25.         }  
    26.         if(GUILayout.Button("截图方式3",GUILayout.Height(30))){  
    27.             //启用顶视图相机  
    28.             CameraTrans.camera.enabled=true;  
    29.             //禁用主相机  
    30.             Camera.main.enabled=false;  
    31.             StartCoroutine(CaptureByCamera(CameraTrans.camera,new Rect(0,0,1024,768),mPath3));  
    32.         }  
    33.     }  
    34.   
    35.   
    36.       
           在第三中截图方式中,在场景里放了一个名为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>/AssetsMac player: <path to player app bundle>/ContentsiPhone player: <path to player app bundle>/<AppName.app>/DataWin 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的文件夹,希望大家以后做相关项目的时候注意一下吧。好了,这就是今天的内容了,希望大家喜欢啊。




    展开全文
  • 转自: unity3d吧 第一步:了解偏振式3D成像原理 第二步:了解现在的硬件技术能帮我们...第三步:如何用Unity3D模拟出3D信号 详细描述请点击链接:http://tieba.baidu.com/p/3038509618?pn=1&qq-pf-to=pcqq.group
  • 我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景,本篇先看...
  • 本帖最后由 hellemic 于 2017-10-17 15:29 编辑Shader来吧,抛砖引玉:Shader "Unlit/DisappearShader"{Properties{_MainTex ("Texture", 2D) = "white" {}_Disappear ("Disappear",Range(-0.5,0.5)) = 0.5}...
  • 提取unity3d游戏资源文件

    千次阅读 2018-02-24 13:16:42
    找了个音乐类的游戏作为练习,只有ios版的,并且是untiy3d做的,所以稍微找了下如何将untiy3d做游戏,把图片剥离出来。作为学习。 雨松MOMO的一个文章 另外一个 其中提到的比较好用的还是 Disunity 这个...
  • 基于像素和砖块(Tile)的游戏类型也再次兴起,而Unity也推出了他们官方的Tile工具——TileMap,但是TileMap默认的Tile是方形的,如果有些开发者(比如我)不想类似于《节奏地牢》的方形砖块,而想类似于《文明》...
  • 如何利用vs2012 debug unity3d

    千次阅读 2014-09-26 17:00:33
    Visual Studio可算是世上最强大的IDE了,最近需要用Unity3D开发2D的游戏,算是个老虎机(Slot Machine)的小demo来调研Unity3D对于我们项目组的适用性。 既然VS这么牛B,以前也开发过一段时间的WPF程序,对VS也...
  • 我是小周,这是我的第一篇博客,自己喜欢游戏,所以大学报了计算机专业,毕业以后也如愿以偿的进入了游戏开发者的队列,现在用Unity3d做MMORPG游戏快一年了,尝试着分享一下自己的经验。 每博加油:不计成本地努力...
  • 那么如何用unity做一个贪吃蛇游戏呢,就跟随作者一起实现以下吧。 效果图: 二、原文链接 原文出处:noobtuts 原文链接:https://noobtuts.com/unity/2d-snake-game 原文作者:不详 三、正文 介绍 这篇文章将讲解...
  • 手把手教你C#制作RPG游戏__罗培羽著是一本很好的国内开发RPG游戏的书籍,可以教会读者如何学会C#做游戏,而Unity3D网络游戏实战游戏开发与设计技术丛书 是在C#基础上,利用Unity引擎开发网络实战游戏,这两本书...
  • 最近突发奇想,想使用unity3d做一个你画我猜的游戏,于是就准备动手研究一下,要做这个游戏,首先第一步得想到的就是如何在unity里面画线,于是上百度,谷歌等各种地方翻抽屉似的查阅了一番,决定用unity开发的...
  • Unity3D 从 ipa 中提取游戏资源

    千次阅读 2015-08-03 21:43:28
    发现一款不错的游戏,是用unity 3d 开发的,想提取资源看看,网上搜了些资料,总结一下,个备忘。 如何是否为 unity3d 引擎开发, .ipa 文件是压缩文件的格式,我们用可以用 tar zxvf xxx解压,或者找个解压...
  • Unity3D如何读取保存XML,以及U3D内置方式保存文件 标签: unity脚本 2014-10-20 17:12 214人阅读 评论(0) 收藏 举报  分类: 学习札记(20)  保存工程的信息:比如游戏进程中的位置...
  • 之前见过很多分屏的赛车游戏,中间屏幕显示正前方的画面,两边屏幕显示车窗和后视镜画面,一直不知道怎么实现的,后来在项目的时候也用到了这样的技术,所以就去网上搜了一下,结果实现起来非常简单。 首先要先...
  • 行为树(BTTree)笔记 为什么是Lua版本的行为树 目前国内的手机游戏都标配热更新功能,而游戏AI自然也是MMO游戏的一个标配,比如...目前很多Unity3D项目都是把Lua为脚本语言,比如我们项目就是Lua逻辑开发的3DM...
  • unity3D制作2048

    千次阅读 2015-01-29 16:34:34
    unity如何制作2048,2048游戏怎么用unity,制作2048.2048的制作,unity2048
  • 5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。 6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化. 7、...
  • VR硬件飞速发展,但内容却极为稀缺,作为开发者,我们究竟该如何上手VR开发?...又该如何将VR技术更好地运用到游戏、应用开发以及内容创作中,了解哪些是从事VR开发技能,又有哪些是为「糟粕」亟需摒弃。
  • 我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景,本篇先看...
  • Unity3D —— 手机设备震动接口

    万次阅读 2017-05-17 11:42:43
    引言:在应用或游戏开发的时候,有时候我们会需要让设备有明显的响应输出以增强交互效果,常见的有:音频输出、屏幕闪烁和手机震动,这里我们就来实现以下如何Unity中调安卓和苹果手机的震动接口。实现步骤:...
  • Unity3d接入IOS内购

    万次阅读 2015-06-02 12:13:27
    利用Unity3d制作完毕游戏发布到appstore,有时会做游戏内购买虚拟物品,也就是内购。 在Ios开发中叫做:In App Purchase,简称IPA 那么如何unity3d内嵌入IPA呢?几经辗转,多方搜索,摸索出点经验,分享给大家,如...
  • 这个教程将教你如何用Unity3D构建一个小球击倒柴火堆的游戏!在这个过程中,你将了解到关于使用物理引擎的重要性和你这么后可以减少无数小时的手工动画的时间。继续阅读! 有什么完整的现代游戏引擎会缺少...
  • 腾讯Unity3D手游 dll加密分析

    万次阅读 2015-10-12 18:21:18
    TX有很多用Unity做的手游,比如《天天飞车》《我叫MT2》都对dll进行了加密,而且这些游戏对dll的加密方式是一样的 想要知道如何解密就要知道他是如何加密的 关于Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll...
  • 这个游戏属于比简单的,大神可以直接无视,如果有做错的地方请大家多多指点,我也是刚学如何做游戏。代码是C#编写,主要实现的功能有三个:第一人称移动控制、角色控制(如射击)、TCP服务端和客户端。

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

如何用unity3d做游戏