Unity3D学习笔记#5_Unity3D再次概览(更全面一点)

嗯,没错,我又换教程了!之前参考的两个教程虽然都不够全面,但是好歹帮助我对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.position, transform.rotation);
            myobjins.AddComponent<Rigidbody>();
            myobjins.GetComponent<Renderer>().material.color = Color.blue;
            myobjins.transform.position = new Vector3(0, 10, 0);
        }
        if (GUILayout.Button("CreatePrimitive-Cube", GUILayout.Height(50)))
        {   // 创建内建的cube
            GameObject m_cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            m_cube.AddComponent<Rigidbody>();
            m_cube.GetComponent<Renderer>().material.color = Color.blue;
            m_cube.transform.position = new Vector3(0, 10, 0);
        }
        if (GUILayout.Button("CreatePrimitive-Sphere", GUILayout.Height(50)))
        {   // 创建内建的sphere
            GameObject m_cube = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            m_cube.AddComponent<Rigidbody>();
            m_cube.GetComponent<Renderer>().material.color = Color.red;
            m_cube.transform.position = new Vector3(0, 10, 0);
        }
        if (GUILayout.Button("移动立方体", GUILayout.Height(50)))
        {   // 移动cube
            cube.transform.Translate(Vector3.forward * transSpeed * Time.deltaTime, Space.World);
        }
        if (GUILayout.Button("旋转立方体", GUILayout.Height(50)))
        {   // 旋转cube
            cube.transform.Rotate(Vector3.up * rotaSpeed, Space.World);
        }
        if (GUILayout.Button("缩放立方体", GUILayout.Height(50)))
        {   // 缩放cube
            cube.transform.localScale = new Vector3(scale, scale, scale);
        }
    }
}

(4). 把脚本拖给主像机,并给变量赋值:
在这里插入图片描述
(5). 效果
在这里插入图片描述
代码已经上传GitHub

三、GUI系统

Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI 等(早期的 Unity 3D 采用的是 OnGUI 系统,后来进展到了 NGUI 系统,在 Unity 4.6 以后 Unity 官方推出了新的 UGUI 系统,采用全新的独立坐标系,为游戏开发者提供了更高的运转效率),这些类型的图形系统内容十分丰富,包含游戏中通常使用到的按钮、图片、文本等控件。玩家在启动游戏的时候,首先看到的就是游戏的 GUI,其中包括贴图、按钮和高级控件等。

①OnGUI系统

OnGUI 系统的可视化操作界面较少,大多数情况下需要开发人员通过代码实现控件的摆放以及功能的修改。

开发人员需要通过给定坐标的方式对控件进行调整,规定屏幕左上角坐标为(0,0,0),并以像素为单位对控件进行定位。

常用的控件有:
在这里插入图片描述
其中,BackgoundColor/Color、ToolTip、Skin比较特殊,别的都使用起来类似:

Button:

if(GUI.Button(new Rect(Screen.width/2-50, Screen.height/2+130, 70, 70),atnTexture)){ // 制定了button的位置和贴图
    Application.LoadLevel("play");
}
if(GUI.Button(new Rect(0, 0, 100, 50), "click here")){ // 制定了button的位置和文字
        print("you have click here!");
    }

Backgound Color:

void OnGUI(){ // 设置了button的背景色
    GUI.backgroundColor=Color.red;
    GUI.Button(new Rect(10, 110, 70, 30), "A button");
}

ToolTip:

    GUI.Box(new Rect(5, 35, 210, 175), new GUIContent("Box", "this box has a tooltip")); // box容器
    GUI.Button(new Rect(30, 85, 100, 20), "No tooltip here"); // 不带有tooltip的button
    GUI.Button(new Rect(30, 120, 100, 20), new GUIContent("I have a tooltip", "The button overrides the box")); // 带有tooltip的button
    GUI.Label(new Rect(10, 40, 100, 40), GUI.tooltip); // 把 tooltip 显示出来

②UGUI

UGUI 系统有 3 个特点:灵活、快速、可视化,在 UGUI 中创建的所有 UI 控件都有一个 UI 控件特有的 Rect Transform 组件。在 Unity 3D 中创建的三维物体是 Transform,而 UI 控件的 Rect Transform 组件是UI控件的矩形方位,其中的 PosX、PosY、PosZ 指的是 UI 控件在相应轴上的偏移量。

Canvas画布

Canvas 是画布,是摆放所有 UI 元素的区域,在场景中创建的所有控件都会自动变为 Canvas 游戏对象的子对象,若场景中没有画布,在创建控件时会自动创建画布。

画布创建后,系统都会自动创建一个名为 EventSystem 的游戏对象,上面挂载了若干与事件监听相关的组件可供设置。
在这里插入图片描述
Canvas具有三种Render Mode:
所有像机:Screen Space-Overlay
指定像机:Screen Space-Camera
类似物体:World Space

每个 Mode 还有一些设置参数,一个比较全面的说明如下:
在这里插入图片描述
Canvas Scaler和Graphic Raycaster中也有很多有意义的参数。

Event System

Event System 也是 GameObject,伴随着 Canvas 自动创建。

其中重要的组件是 Input Module,自带一个 Standalone Input Module,这是用于 PC 单机的,还可以添加别的 Input Module。Input Module 封装了 Input 模块的调用,根据用户操作触发各 Event Trigger。

自带组件介绍:

  1. Event System 事件处理组件
    是一种将基于输入的事件发送到应用程序中的对象,使用键盘、鼠标、触摸或自定义输入均可。
  2. Standalone Input Module(独立输入模块)
    用于鼠标、键盘和控制器。该模块被配置为查看 InputManager,基于输入 InputManager 管理器的状态发送事件。

各种控件

Panel、Text、Image、Raw Image、UGUI Button、UGUI Toggle、UGUI Slider、Scrollerbar、Input Field、Dropdown。

Panel:
Unity 3D panel 控件又叫面板,面板实际上就是一个容器,在其上可放置其他 UI 控件。一个功能完备的 UI 界面往往会使用多个 Panel 容器控件,而且一个面板里还可套用其他面板。当创建一个面板时,此面板会默认包含一个 Image 组件,其中,Source Image 用来设置面板的图像,Color 用来改变面板的颜色。

如果想把控件放到面板中,需要把控件设置为面板的子对象。

Text:
在 Unity 3D UGUI 中创建的很多 UI 控件都有一个支持文本编辑的 Text 控件。Text 控件也称为标签,Text 区域用于输入将显示的文本。它可以设置字体、样式、字号等内容。
在这里插入图片描述
Image:
Source Image 是要显示的源图像,要想把一个图片赋给 Image,需要把图片转换成精灵格式,转化后的精灵图片就可拖放到 Image 的 Source Image 中了。转换方法为:

在 Project 视图中选中要转换的图片,然后在 Inspector 属性面板中,单击 Texture Type(纹理类型)右边的下拉列表,选中 Sprite(2D and UI)并单击下方的 Apply 按钮。

Raw Image:
Raw Image 控件类似于 Image 控件,但是,Raw Image 控件可以显示任何纹理,而 Image 只能显示一个精灵。

Button:
Button 是一个复合控件,其中还包含一个 Text 子控件,通过此子控件可设置 Button 上显示的文字的内容、字体、文字样式、文字大小、颜色等,与前面所讲的 Text 控件是一样的。

复合控件在 Hierarchy 面板中会显示出其层次。

Toggle:
Toggle 控件也是一个复合型控件,如下图所示。它有 Background 与 Label 两个子控件,而 Background 控件中还有一个 Checkmark 子控件。Background 是一个图像控件,而其子控件 Checkmark 也是一个图像控件,其 Label 控件是一个文本框,通过改变它们所拥有的属性值,即可改变 Toggle 的外观,如颜色、字体等。

此外还有 Dropdown、Slider、Scrollbar、Input Field,就不具体介绍了,需要时自行查看。

此外,我们注意到,每个控件都有一个可以添加响应函数的区域,例如对于一个Button:
在这里插入图片描述

四、其它

①地形系统

Unity 3D 有一套功能强大的地形编辑器,支持以笔刷方式精细地雕刻出山脉、峡谷、平原、盆地等地形,同时还包含了材质纹理、动植物等功能。场景涉及人物、地形以及各类型的建筑模型。大多数人物模型和建筑模型都是在 3ds Max、Maya 等专业的三维模型制作软件中做出来的。

在 Unity 3D 中编辑地形有两种方法:一种是通过地形编辑器编辑地形,另一种是通过导入一幅预先渲染好的灰度图来快速地为地形建模。地形上每个点的高度被表示为一个矩阵中的一列值。这个矩阵可以用一个被称为高度图(heightmap)的灰度图来表示。灰度图是一种使用二维图形来表示三维的高度变化的图片。近黑色的、较暗的颜色表示较低的点,接近白色的、较亮的颜色表示较高的点。通常可以用 Photoshop 或其他三维软件导出灰度图,灰度图的格式为 RAW 格式,Unity 3D 可以支持 16 位的灰度图。

在地形/Terrain/齿轮的如下区域可以导入地形:
在这里插入图片描述
使用 ps 可以把 geotiff 格式转换为 raw 格式。

如果手动编辑地形,那么参考要点

水的效果需要Unity基本资源包,这个在2019版本似乎无法导入了,可以想别的办法。雾和天空盒(Unity 3D 中的天空盒实际上是一种使用了特殊类型 Shader 的材质,这种类型的材质可以笼罩在整个场景之外,并根据材质中指定的纹理模拟出类似远景、天空等效果,使游戏场景看起来更加完整)的设置:
在这里插入图片描述

②物理引擎

游戏中物理引擎的作用是模拟当有外力作用到对象上时对象间的相互影响,比如赛车游戏中,驾驶员驾驶赛车和墙体发生碰撞,进而出现被反弹的效果。物理引擎在这里用来模拟真实的碰撞后效果。通过物理引擎,实现这些物体之间相互影响的效果是相当简单的。

在 Unity 3D 内的 Physics Engine 引擎设计中,使用硬件加速的物理处理器 PhysX 专门负责物理方面的运算。因此,Unity 3D 的物理引擎速度较快,还可以减轻 CPU 的负担,现在很多游戏及开发引擎都选择 Physics Engine 来处理物理部分。在 Unity 3D 中,物理引擎是游戏设计中最为重要的步骤,主要包含刚体、碰撞、物理材质以及关节运动等。

Rigidbody

可以为游戏对象赋予物理属性,使游戏对象在物理系统的控制下接受推力与扭力,包括重力,从而实现现实世界中的运动效果。

刚体是物理引擎中最基本的组件。通常把在外力作用下,物体的形状和大小(尺寸)保持不变,而且内部各部分相对位置保持恒定(没有形变)的理想物理模型称为刚体。在一个物理引擎中,刚体是非常重要的组件,通过刚体组件可以给物体添加一些常见的物理属性,如质量、摩擦力、碰撞参数等。

Unity 3D 提供了多个实现接口,开发者可以通过更改这些参数来控制物体的各种物理状态。

参数 含义 功能
Mass 质量 物体的质量(任意单位)。建议一个物体的质量不要与其他物体 相差100倍
Drag 阻力 当受力移动时物体受到的空气阻力。0表示没有空气阻力,极 大时使物体立即停止运动
Angular Drag 角阻力 当受扭力旋转时物体受到的空气阻力。0表示没有空气阻力, 极大时使物体立即停止旋转
Use Gravity 使用重力 该物体是否受重力影响,若激活,则物体受重力影响
Is Kinematic 是否是运动学 游戏对象是否遵循运动学物理定律,若激活,该物体不再受物理 引擎驱动,而只能通过变换来操作。适用于模拟运动的平台或 者模拟由铰链关节连接的刚体
Interpolate 插值 物体运动插值模式。当发现刚体运动时抖动,可以尝试下面的选项:None(无),不应用插值;Interpolate(内插值),基于上一帧变换来平滑本帧变换;Extrapolate(外插值),基于下一帧变换来平滑本帧变换
Collision Detection 碰撞检测 碰撞检测模式。用于避免高速物体穿过其他物体却未触发碰撞。碰撞模式包括Discrete (不连续)、Continuous (连续)、 Continuous Dynamic (动态连续〉3种。其中,Discrete模式用来检测与场景中其他碰撞器或其他物体的碰撞;Continuous模式用来检测与动态碰撞器(刚体)的碰撞;Continuous Dynamic模式用来检测与连续模式和连续动态模式的物体的碰撞,适用于高速物体
Constraints 约束 对刚体运动的约束。其中,Freeze Position(冻结位置),表示在世界中沿所选某个轴的移动将无效,Freeze Rotation(冻结旋转)表示刚体在世界中沿所选的X、Y、Z轴的旋转将无效

Collider

在 Unity 3D 的物理组件使用过程中,碰撞体需要与刚体一起添加到游戏对象上才能触发碰撞。值得注意的是,刚体一定要绑定在被碰撞的对象上才能产生碰撞效果,而碰撞体则不一定要绑定刚体。

碰撞体需要和刚体一起来使碰撞发生,如果两个刚体撞在一起,物理引擎不会计算碰撞,除非它们包含一个碰撞体组件。没有碰撞体的刚体会在物理模拟中相互穿透。

Collider的参数一般为:
在这里插入图片描述

一般游戏对象往往具有 Box Collider 属性,如墙壁、门、墙以及平台等,也可以用于布娃娃的角色躯干或者汽车等交通工具的外壳,当然最适合用在盒子或是箱子上。

Mesh Collider(网格碰撞体)根据 Mesh 形状产生碰撞体,比起 Box Collider、Sphere Collider 和 Capsule Collider,Mesh Collider 更加精确,但会占用更多的系统资源。其参数为:
在这里插入图片描述
Wheel Collider(车轮碰撞体)是一种针对地面车辆的特殊碰撞体,自带碰撞侦测、轮胎物理现象和轮胎模型,专门用于处理轮胎。其参数为:
在这里插入图片描述
其余 Collider 就不介绍了。

Trigger

检测碰撞发生的方式有两种,一种是利用碰撞体,另一种则是利用触发器(Trigger)。触发器用来触发事件。Unity 3D 中的碰撞体和触发器的区别在于:碰撞体是触发器的载体,而触发器只是碰撞体的一个属性。

如果既要检测到物体的接触又不想让碰撞检测影响物体移动,或者要检测一个物体是否经过空间中的某个区域,这时就可以用到触发器。

当绑定了碰撞体的游戏对象进入触发器区域时,会运行触发器对象上的以下三个函数:

MonoBehaviour.OnTriggerEnter(Collider collider);
MonoBehaviour.OnTriggerExit(Collider collider);
MonoBehaviour.OnTriggerStay(Collider collider);

碰撞体和刚体的组合效果为(不使用重力,不使用动力学,Interpolate,Continuous Dynamic):

物体1\物体2 None Collider Rigidbody Colider+Rigidbody
None 穿透,OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以 穿透, OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以
Collider 穿透,都可以OnMouseDrag 穿透,物体1可以OnMouseDrag,物体2不可以 物体1穿透2(低速且物体2原地不动),物体2无法穿透1,且1无物理效果,2有物理效果,都可以OnMouseDrag
Rigidbody 穿透,OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以
Colider+Rigidbody 全部可以

总之,至少有两个Collider,至少一个有Rigidbody,就可以发生碰撞。如果不希望被撞跑,可以勾选Is Kinematic。想要正常碰撞,最好都添加Rigidbody,然后用Is Kinematic控制物理效果。

物理材质

物理材质是指物体表面材质,用于调整碰撞之后的物理效果。
在这里插入图片描述

AddForce函数

Unity 3D 中通过 rigidbody.AddForce(x,y,z)方法添加力的作用,该方法的参数是施加力的方向,参数大小代表了力的大小。

下面代码实现了,如果鼠标拖拽时,如果有Rigidbody就施加一个力,否则就拖动:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mousedrag : MonoBehaviour
{
    void OnMouseDrag()
    {
        if (this.gameObject.GetComponent<Rigidbody>() != null)
        {
            this.gameObject.GetComponent<Rigidbody>().AddForce(Input.GetAxis("Mouse X") * 5, Input.GetAxis("Mouse Y") * 5, 0);
        }
        else
        {
            transform.position += Vector3.right * Time.deltaTime * Input.GetAxis("Mouse X");
            transform.position += Vector3.up * Time.deltaTime * Input.GetAxis("Mouse Y");
        }
    }
}

CharacterController

在 Unity 3D 中,游戏开发者可以通过角色控制器来控制角色的移动,角色控制器允许游戏开发者在受制于碰撞的情况下发生移动,而不用处理刚体。角色控制器不会受到力的影响,在游戏制作过程中,游戏开发者通常在任务模型上添加角色控制器组件进行模型的模拟运动。
在这里插入图片描述
角色控制器.Move(new Vector3(x, y, z))即可移动。

Joint

在 Unity 3D 中,物理引擎内置的关节组件能够使游戏对象模拟具有关节形式的连带运动。关节对象可以添加至多个游戏对象中,添加了关节的游戏对象将通过关节连接在一起并具有连带的物理效果。关节组件的使用必须依赖刚体组件。

有 Hinge Joint,Fixed Joint,Spring Joint,Character Joint,Configurable Joint等多种。

Cloth

布料是 Unity 3D 中的一种特殊组件,它可以随意变换成各种形状,例如桌布、旗帜、窗帘等。Unity 3D 中的布料系统为游戏开发者提供了强大的交互功能。布料系统为游戏开发者提供了一个更快、更稳定的角色布料解决方法。

Ray

射线是三维世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。射线应用范围比较广,广泛应用于路径搜寻、AI逻辑和命令判断中。

下面代码中,首先创建一个 Ray 对象,从摄像机发出到单击处的射线,然后输出射到物体的名字:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camray : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            //从摄像机到单击处发出射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                //画出射线, 只有在Scene视图中才能看到
                Debug.DrawLine(ray.origin, hitInfo.point);
                GameObject gameObj = hitInfo.collider.gameObject;
                Debug.Log("click object name is" + gameObj.name);
                //当射线碰撞目标的标签是Pickup时, 执行拾取操作
                if (gameObj.tag == "Pickup")
                {
                    Debug.Log("pick up!");
                }
            }
        }
    }
}

其中,out的用法参考:https://www.cnblogs.com/yuyexiaoxiao/p/11841183.html

Physics Manager

Unity 3D 集成开发环境作为一个优秀的游戏开发平台,提供了出色的管理模式,即物理管理器(Physics Manager)。物理管理器管理项目中物理效果的参数,如物体的重力、反弹力、速度和角速度等。

在 Unity 3D 中执行 Edit→Project Settings→Physics 命令可以打开物理管理器。
在这里插入图片描述
物理引擎相关代码已经上传Gitbub

③动画

主要介绍 Unity 3D 开发中的三维模型以及 Unity 3D 中的新版 Mecanim 动画系统。

三维模型

三维模型是用三维建模软件建造的立体模型,也是构成 Unity 3D 场景的基础元素。Unity 3D 几乎支持所有主流格式的三维模型,如 FBX 文件和 OBJ 文件等。

主流的三维建模软件有:Autodesk 3D Studio Max,Autodesk Maya,Cinema 4D。

动画系统

Mecanim 动画系统是 Unity 公司推出的全新动画系统,具有重定向、可融合等诸多新特性,可以帮助程序设计人员通过和美工人员的配合快速设计出角色动画,Mecanim 动画系统提供了 5 个主要功能:

  • 通过不同的逻辑连接方式控制不同的身体部位运动的能力。
  • 将动画之间的复杂交互作用可视化地表现出来,是一个可视化的编程工具。
  • 针对人形角色的简单工作流以及动画的创建能力进行制作。
  • 具有能把动画从一个角色模型直接应用到另一个角色模型上的 Retargeting(动画重定向)功能。
  • 具有针对 Animation Clips 动画片段的简单工作流,针对动画片段以及它们之间的过渡和交互过程的预览能力,从而使设计师在编写游戏逻辑代码前就可以预览动画效果,可以使设计师能更快、更独立地完成工作。

Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构。Unity 3D 为其提供了一个特殊的工作流和一整套扩展的工具集。由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个人形骨架映射到另一个人形骨架,从而实现动画重定向功能。

创建模型动画的一个基本步骤就是建立一个从 Mecanim 动画系统的简化人形骨架到用户实际提供的骨架的映射,这种映射关系称为 Avatar。在导入一个角色动画模型之后,可以在 Import Settings 面板中的 Rig 选项下指定角色动画模型的动画类型,包括 Legacy(旧版动画类型)、Generic(一般动画类型) 以及 Humanoid(人形动画)3 种模式。

要使用 Humanoid(人形动画),单击 Animation Type 右侧的下拉列表,选择 Humanoid,然后单击 Apply 按钮,Mecanim 动画系统会自动将用户所提供的骨架结构与系统内部自带的简易骨架进行匹配,如果匹配成功,Avatar Definition 下的 Configure 复选框会被选中,同时在 Assets 文件夹中,一个 Avatar 子资源会被添加到模型资源中。

Unity 3D 中的 Avatar 是 Mecanim 动画系统中极为重要的模块,正确地设置 Avatar 非常重要。不管 Avatar 的自动创建过程是否成功,用户都需要到 Configure Avatar 界面中确认 Avatar 的有效性,即确认用户提供的骨骼结构与 Mecanim 预定义的骨骼结构已经正确地匹配起来,并已经处于 T 形姿态。

动画主要依靠Animator 组件,以及Animator Controller,具体我们需要时再深入研究。现介绍其参数:
在这里插入图片描述
Animation组件也是用于动画的,但是它比较简单,其参数为:
在这里插入图片描述
关于两个动画组件的介绍见这里

④导航

Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路。

Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。

这个就暂时不仔细研究了,可以参看这里

发布了29 篇原创文章 · 获赞 61 · 访问量 9292

猜你喜欢

转载自blog.csdn.net/u013695457/article/details/105004621