文章目录
嗯,没错,我又换教程了!之前参考的两个教程虽然都不够全面,但是好歹帮助我对Unity3D有了初步的认识,快速实现了一些简单的小功能,培养了兴趣。人们都说,第一步往往是最困难的,因为你什么都不懂,遇到点问题就止步不前了,所以无论如何我感谢两位作者。本文开始主要参考C语言中文网上的一个教程。
一、Unity认识再次补充
①Unity的地位和模型支持
U3D是Unity Technologies公司开发的,功能全面丰富,跨各种主流平台,用途除了游戏还有很多:虚拟仿真教育、军事与航天、虚拟战场、室内设计、城市规划、工业仿真、文物古迹展示和保护等。据说,全球最赚钱的 1000 款手机游戏中,有 30% 是使用 Unity 3D 开发出来的。尤其在 VR 设备中,Unity 3D 游戏开发引擎具有统治地位。
Unity3D支持各种模型格式,包括3ds Max、Maya、Blender等。
②Unity项目发布到PC平台的方法
这个过程是非常简单的,首先点击菜单栏File->Build Settings,发现进入如下页面,按照图中的注释操作即可。
我进行了简单配置,发布了上一篇文章制作的游戏:
箭头所指就是游戏文件。
③Unity软件界面补充介绍
(1)布局调整
下图中两个红圈都可以调整成系统内置的布局,一个是在工具栏的,一个是在菜单栏的。一般推荐使用Wide或者2 by 3布局。
我们也可以自己调整布局,每个子窗口都是能拖动的。调整好后,可以在下图所示的位置保存我们自己的布局方式(下图红圈),有时软件会报布局异常,则点击下图中的方框位置即可解决。
(2)界面补充介绍
我们以Wide布局为例,其各个视图的位置如下:
Unity中的游戏对象可以在各个视图中拖动,比如把Project中的Prefab拖到Hierarchy、Scene中,把Project中的脚本、动画拖到Inspector中,可以多加尝试。
Hierarchy视图:
Scene中游戏对象的树状关系图,和Scene中的游戏对象一一对应。
tips-1. 在Hierarchy的Scene、空白处、游戏对象上右击触发菜单,菜单的内容有所不同;
tips-2. 当游戏对象很多时,可以用Hierarchy视图上侧的搜索框搜索我们需要的游戏对象,提高效率;
tips-3. 按住alt键,点击Hierarchy中游戏对象左侧的小箭头,可以一次性递归地展开或者收起所有其子对象;
tips-4. 点击加号符号等于空白处右键,点击竖排三点符号,则可以打开Hierarchy视图设置的菜单。
Project视图:
对应Unity工程下的Assets文件夹,存放着游戏的所有资源,例如场景、脚本、三维模型、纹理、音频文件和预制组件等。建议所有操作都在Project中进行而不是去Windows的资源管理器中,比如添加一个图片我们直接拖到Project中即可,这样可以避免出现bug。
tips-1. 下方的小滑块可调整图标显示的大小,调到最左侧即变为列表的形式;点击某个图标,滑块左侧的空白区域显示图标的相对路径(搜索出的内容点击它时则显示分层的搜索路径),图标区上方也会显示相对路径;
tips-2. 搜索框和旁边的过滤搜索项按钮可帮助我们高效搜索,比Hierarchy中的搜索强大很多,此外各种菜单的触发类似Hierarchy视图;
tips-3. 列表中的Favorites可以保存我们最常用的资源,直接把下方的Assets中的内容拖上来即可,也可在搜索后,点击搜索条旁边的星号,保存搜索结果到Favorites。
Inspector视图:
游戏对象组件及组件编辑,主要是调整参数。
tips-1. Tag在编程时作用很大,用于区分物体;Layer把物体分成不同的层(比如水、UI、透明),在编程中用于区分不同的组,在设计中显示更清晰,即在软件工具栏中可以选择显示/屏蔽某些层:
tips-2. 很多组件的调整需要配合Scene视图,此时注意Shift键具有很多作用,比如一些参数的反向调节。
Scene视图:
游戏场景/关卡可视化编辑。
tips-1. scene中物体的调节模式按钮对应键盘QWERTY键。
tips-2. 绘图模式有如下几种:
Game视图:
游戏运行模拟窗口。
菜单栏和快捷键:
参考这里。
二、动态GUI和动态GameObject
①动态游戏对象
U3D中创建游戏对象的方法有 3 种:
第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中;
第二种是在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 Cube、Camera、Light 等;
第三种是利用脚本编程,动态创建或删除游戏对象。
第三种是动态的,又有两个函数:CreatePrimitive用来创建内建的简单对象,Instantiate则可以创建prefab的实例。
②动态GUI
在脚本中,void OnGUI()函数是用来绘制GUI的,每帧都会多次调用,我们可以在其中使用,如下语句创建GUI元素:
void OnGUI()
{
if (GUILayout.Button("Instantiate", GUILayout.Height(50)))
{
// 按钮触发后的动作
}
③小例子
首先,再介绍下角色控制器:
角色控制器主要用于第三人称或第一人称游戏主角控制,并不使用刚体物理效果。添加 Rigidbody 组件,取消选中 Use Gravity 复选框,选中 Is Kinematic 复选框使其不受物理影响,而是受脚本控制。
角色控制器中的选项设置:
角色的移动还可以使用如下函数:
// 获取角色控制器
charactorController=this.GetComponent<CharacterController>();
// 获取主相机
mcam = Camera.main.transform;
// 获取按键
if(Input.GetKey(KeyCode.W)){
}
// 使用角色控制器提供的Move函数进行移动
charactorController.Move(this.transform.TransformDirection(new Vector3(xm, ym, zm)));
然后,我们开始设计一个带有按钮的程序,点击按钮动态生成对象:
(1). 我们随便编辑一个游戏对象,拖入Project作为prefab,命名为MyObj;
(2). 在Hierarchy中创建一个Cube;
(3). 在Project中创建一个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class create_game_objects : MonoBehaviour
{
public GameObject myObj; // prefab
public GameObject cube; // cube对象
public int transSpeed = 100;
public float rotaSpeed = 10.5f;
public float scale = 3;
void OnGUI() // gui绘制和功能
{
// 以下每个if对应一个按钮
if (GUILayout.Button("Instantiate", GUILayout.Height(50)))
{
// 创建我们自制的prefab对象
GameObject myobjins = Instantiate(myObj, transform