Unity3D引擎入门&搭建一个FPS游戏Demo

目录

  • 一、unity3d简介(平台,应用范围,经典游戏)
  • 二、界面,基础操作(界面,创建场景,灯光系统,摄像机,组件,脚本语言)
    • 1、界面
    • 2、基本操作
  • 三、demo制作(坐标系统,视角控制,移动,碰撞,ray,敌人AI,预设,材质,etc)

一、unity3d简介(平台,应用范围,经典游戏)

Unity3d是当时最流行的游戏引擎之一,它具有可视化编辑器,并能通过编写脚本来自定义编辑器,能够快速开发出游戏原型,Unity3D还具有强大的跨平台能力,不但在部署目标方面跨平台(PC、Web、移动设备以及家用机),还包括开发工具跨平台(能在Windows或Mac OS上开发游戏)。相比与RPGMaker的简陋或虚幻引擎的难以上手,Unity3D对于一个有编程基础的初学者上手轻而易举。用Untiy3D开发的游戏也不在少数,从手机游戏《纪念碑谷》到PC游戏《Cuphead》,数不胜数,同时由于Unity3D的强大引擎,也可以用来进行机器人仿真、火灾模拟等工作。

二、界面,基础操作(界面,创建场景,灯光系统,摄像机,组件,脚本语言)

Unity3D引擎入门&搭建一个FPS游戏Demo_第1张图片

1、界面

Unity3D的主界面和一些三维建模软件非常类似(例如,3DsMAX,C4D等)
左上角是scene视图,这里显示了场景中的物体并且可以对场景进行基础的操作;
左下角是Game视图,这是游戏运行时的主要界面;
Hierarchy视图,当前场景中物体目录;
Project视图,显示当前工程的文件夹等;
Inspector视图,当前选中的物体的属性以及组件。

2、基本操作

通过scene视图上的按钮可以对选择物体进行操作,也可以通过快捷键进行抓取(Q)、移动(W)、旋转(E)、放大®操作,鼠标中键平移场景,鼠标滚轮对场景进行缩放,按住Alt+鼠标左键可以旋转查看场景。

通过顶部的工具栏或在Hierarchy视图上右键,可以创建新的3D物体或2D物体,以及灯光、camera等。

在Project视图中,可以右键创建新的场景、预设、或者脚本文件。

Inspector上集成了物体的大部分属性,并可以通过Add Componment添加新的组件。

三、demo制作(坐标系统,视角控制,移动,碰撞,ray,敌人AI,预设,材质,etc)

Unity3D可以在官网上免费下载,只有制作者的游戏达到一定盈利后Unity才会抽取一定的分成,并且unity3d的官方社区具有大量的教程和中文文档,也非常适合自学。官网上最经典的游戏教程是《Space shooter》,每集教程都在五到十分钟,简单却能学到unity3d的很多基础知识,有兴趣的可以去官网上学习。接下来我们将通过一个FPS游戏Demo介绍Unity3d游戏制作流程。

首先打开Unity并且创建一个新的工程,在这个新的工程中,hierarchy视图中默认带有一个Main Camera 和Directional Light,其中Main Camera的视角即是Game视图。在接下来的制作中我们用不到这两个对象,现在我们把这两个对象delete掉。

Unity3D引擎入门&搭建一个FPS游戏Demo_第2张图片

在一个游戏中,首先要有场景,无论是马里奥的砖块世界还是英雄联盟的召唤师峡谷,有了场景,玩家才可以进行游戏。接下来让我们先搭建一个场景。

单击顶部工具栏的GameObject-3D Object-Cube,创建一个立方体(在hierarchy视图中右键创建同理),我们可以看到场景中出现了一个111的立方体。

Unity3D引擎入门&搭建一个FPS游戏Demo_第3张图片

选中这个立方体,通过scene工具栏上的移动、旋转、缩放工具可以任意修改这个立方体。

先把这个立方体拉伸作为地板,选中缩放工具(或者按快捷键R),可以看到立方体的坐标轴上的三个箭头变成了方块,按住鼠标拉动方块可以对立方体长宽高进行修改。另一种方法是更改inspector视图中的scale参数,选中cube,把它的scale设置为(50,1,50) 我们便制作出了地板。

Unity3D引擎入门&搭建一个FPS游戏Demo_第4张图片

Unity3D引擎入门&搭建一个FPS游戏Demo_第5张图片

接着通过同样的操作,创建新的object(也可以尝试创建别的立体形状),对他们位置,旋转,大小进行更改,完成整个场景的搭建。

TIPS:在场景中元素较多难以选中物体时,可以通过hierarchy视图选中物体,按F便可快速定位到scene中的物体位置。

Unity3D引擎入门&搭建一个FPS游戏Demo_第6张图片
创建好的场景

接着,创建一个empty,选中所有的物体,拖到这个empty下,使之成为GameObject的子类,接着把这个GameObject重命名成obstacles。

Unity3D引擎入门&搭建一个FPS游戏Demo_第7张图片

TIPS:场景中物体过多时,hierarchy中会比较杂乱,此时可以通过create empty创建一个空的GameObject来把相同的元素放在一起,以后如果要对这类物体进行整体操作,对这个空的GameObject进行操作即可。

有了基本的场景之后,我们便可以创建玩家控制的角色了,创建一个Capsule和camera,并把camera拖拽到Capsule上,并把camera的Position设为(0,0.5,1)。capsule便是我们要控制的角色了,capsule为角色的body,camera是角色的眼睛,也是game视图看到的场景。最后在hierarchy视图中把capsule重命名为player。

Unity3D引擎入门&搭建一个FPS游戏Demo_第8张图片        capsule所代表的玩家在scene中的视图以及game视图。

概念:本地坐标和全局坐标,在Unity3D中,物体的坐标是基于它的父类的,上例中,camera的坐标(0,0.5,0)就是基于capsule的中心点的坐标,而capsule没有父类,或者可以看作是场景的子类,因此它的坐标就是在场景中的坐标,称为全局坐标。本地坐标和全局坐标的区别在接下来的控制代码中着很好的体现。

有了场景和角色,接下来便可以编写脚本控制角色移动了。首先我们要明白,Unity3d中对物体的所有改动都是基于组件(component)的,对立方体的移动、旋转、缩放是通过改动物体的Transform组件实现的,相应的我们可以看到在一个默认的GameObject中,除了Transform,还有Mesh Filter 和Mesh Renderer 和Box Collider组件,这些组件可以自由的添加和删除。

Unity3D引擎入门&搭建一个FPS游戏Demo_第9张图片

对于我们所控制的角色,我们不需要Box Collider,因此点击Box Collider组件右上角的齿轮,选择remove component,接着点击Add Component按钮,为player添加一个charactercontroller组件,这个组件可以让物体的行为表现的更像一个玩家。

Unity3D引擎入门&搭建一个FPS游戏Demo_第10张图片

                 更改后的player属性

在这些工作完成后,我们的游戏已经基本有了雏形,具有一个第一视角的角色,一个充满各种元素的场景,接着便可以为player编写控制代码了。

首先在project视图中右键创建一个新的文件夹,右键-create-folder,命名为Scripts,(这个文件夹用来存放所有的脚本文件,在一个大工程中,为所有的素材分好类是一个很好的习惯。)接着在这个文件夹下创建一个新的C# Script文件,命名为MouseControl,这个脚本用来控制鼠标的输入。

Unity3D引擎入门&搭建一个FPS游戏Demo_第11张图片
       创建好的MouseControl文件,Inspector中可以看到文件的代码预览

双击打开这个文件,我们可以看到代码的大致框架,在MouseControl类下,有两个默认函数,start()和Update(),start()函数只有在当前脚本加载时运行一次,update()函数在游戏运行每帧运行一次。要想响应鼠标的输入,我们只要把对鼠标输入的监听写在update()中即可,接着只要把MouseControl作为组件添加到player上,代码就能运作了。

Unity3D引擎入门&搭建一个FPS游戏Demo_第12张图片

代码详解:
在MouseControl脚本中,我们声明了public的枚举类型RotatioAxes(输入方式),sensitivityHor(水平灵敏度),sensitivityVert(垂直灵敏度),以及MINVert,MAXVert(垂直控制最大最小角度),在Unity3d中,所有的public变量都可以在inspector视图中直接修改,所有把需要修改的变量设置为public,便可以方便的在unity中调试了。

如图所示,当前控制方式Axes的值为MouseXAndY,即为同时控制X轴和Y轴,水平和垂直灵敏度都是10,垂直控制角度为(-45°,45°)。

Unity3D引擎入门&搭建一个FPS游戏Demo_第13张图片

在Update()中我们为Axes的三种模式设置了不同的输入方式,Input.GetAxis()用于获取响应输入量的值,所有的输入量可以在Edit-Project Settings-Input中查到。

只控制水平移动,只要用transform下的Rotate()函数进行旋转即可,
Rotate(x,y,z):根据对象的本地坐标绕轴旋转(x,y,z)度

只控制垂直移动,由于要限制垂直旋转在-45~45度内,再简单的用Rotate()函数就不行了(思考为什么),这时要用transform.localEulerAngles设置对象的旋转值。

rotate()函数相当于使对象根据当前角度再旋转相应的角度,如果想让物体绕x轴旋转两圈,rotate(720,0,0)就可以了,而transform.localEulerAngles属性类似于物体transform组件中的Rotation属性,每个轴的范围在(0,360)。

同时控制水平和垂直旋转,同垂直控制,只要给物体的transform.localEulerAngles属性设置一个新的值就行了。

把MouseControl拖到player上,设置Axes为MouseXAndY按下unity3d顶部大大的播放键,这时在game视图中就可以轻松的控制镜头的转动了。接着,我们为角色添加移动代码。

创建新的脚本文件MoveController,跟鼠标控制一样,我们也声明了public变量:moveSpeed,用来方便修改移动速度。在这个脚本中,我们可以看到在start()函数中:
         characterController = GetComponent();
这句代码用来获取到角色上的CharacterController组件,每个对象上的component可以看成是一个个独立的模块,要想在一个模块中用到另一个模块的功能,就要用到ComponentType t = Component()来实例化一个组件的对象t,接着便可以用t来调用另一个component上的函数了。在这块代码中characterController变量(小写是变量)引用了对象上的CharacterController组件,并通过CharacterController组件上的Move()函数控制角色的移动。

通过对比前一个脚本代码,在这我们也可以通过设置transform的position值移动角色,但是我们可以想想,为什么之前要移除Box Collider组件(碰撞体),而添加一个CharacterController组件。这是因为CharacterController中也包含碰撞体以及其他让角色的行为更像一个玩家的属性,因此在使用Move()函数时,在碰到边界或者障碍物便会产生碰撞而不会直接穿过,而通过position属性但组件设置不正确时有可能参产生”穿模”的情况。

Unity3D引擎入门&搭建一个FPS游戏Demo_第14张图片

这样基础的控制镜头和移动的代码就完成了,把这两个脚本都拖到player的组件上,并设置axes为MouseXAndY,按下play键,就可以自由的在场景中移动了。但我们仔细观察代码可以发现:
       movement = transform.TransformDirection(movement);
这句代码把本地坐标转换成了全局坐标,如果删除这句代码,对移动会产生什么影响,大家可以自己试试看。



除此之外,为角色添加重力、跳跃等功能也很简单,此处由于篇幅有限,留给大家自己尝试。




本篇教程仅面向对制作游戏感兴趣的初学者,文中并未涉及到灯光系统、天空盒、UI、粒子系统等更深入的功能介绍,仅作为抛砖引玉,希望能激发大家编程和制作游戏的热情。

你可能感兴趣的:(未分类)