Unity学习第一日

  • 前言
    • Unity介绍
    • 游戏开发技术
    • 技术实现与游戏设计
  • 第一章 Unity脚本概览
    • 1.1 控制物体的移动
      • 1.1.1 新建脚本并挂载
      • 1.1.2 Start 和 Updata 事件
      • 1.1.3 修改物体位置
      • 1.1.4 读取和处理输入
      • 1.1.5 实例:实现一个移动的小球
    • 1.2 触发器事件
      • 1.2.1 创建触发器
      • 1.2.2 触发器事件函数
      • 1.2.2 实例:吃金币

前言

 Unity 是实时3D互动内容创作和运营平台。
 使用Unity前我们需要先了解这个游戏引擎
Unity官网

Unity介绍

  • 使用Unity开发的软件:
    原神
    王者荣耀
    明日方舟
    使命召唤手游
    炉石传说

  • 百度百科

  • Unity 用户手册

游戏开发技术

  • 游戏设计 (游戏的灵魂)
  • 美术制作 (游戏的外表)
  • 技术实现 (游戏的骨骼和血肉)

技术实现与游戏设计

游戏技术游戏设计互相促进:技术设计带来可能性的空间,设计指导者技术的发展方向。

第一章 Unity脚本概览

本章主在让读者体会脚本编程的思路整体方法

1.1 控制物体的移动

本节将详细讲解创建脚本、改变物体位置、处理用户输入等基本操作

1.1.1 新建脚本并挂载

  • 脚本的创建

    • 方法一:
      在Project(工程)窗口某个文件夹中,单机鼠标右键选择:Create->C# Script选项。
    • 方法二:
      先新建一个球体,即在Hierarchy窗口,单机鼠标右键选择:3D object->Sphere选项。
      然后选中球体,在Insperctor(检视)窗口单击:Add Component(添加组件)按钮,在菜单中选择:New script (新建脚本)选项,输入脚本文件名单击:Create and Add(创建并添加)。
  • 脚本的挂载
    • 方法一:
      拖拽脚本到场景中的球体上。
    • 方法二:
      拖拽脚本到Inspector窗口中项目的最后面。(推荐使用)
  • 脚本组件的删除
     在组件名称上单击鼠标右键,选择:Remove Component(删除组件)。
  • 注意事项
     Unity 规定:能够挂载到物体上的脚本文件必须是“脚本组件”,脚本组件要继承自MonoBehaviour,且脚本代码中的class名称必须与文件名一致。(因此在修改脚本文件名时,必须同时修改class名称)。
     Unity 支持一个物体挂载多个同样的脚本组件。

1.1.2 Start 和 Updata 事件

  • 双击脚本文件打开脚本,目前脚本中的内容是自动生成的,包括:
    using UnityEngine(使用UnityEngine这个命名空间)
    Start(函数)
    Update(函数)
  • Start和Update函数
    Start函数在游戏开始运行依次,适合进行组件初始化。
    Update函数每帧都会执行,根据系统资源情况,帧率可能实时变化,因此Update的执行频率(每秒执行次数)是变化的。
    Start和Update又被称为“事件”,因为它们分别是在“组件开始运行”和“更新该组件”这两个事件发生时被调用的。
  • Debug.Log函数
    作用:向Console(控制台)窗口输出一串信息。
    用处:写代码、调试代码,是最简单、最可靠的一种调试手段。
  • Time类
    Time.time:显示游戏运行时间。
    Time.deltaTime:表示从上一帧到当前帧时间,时间增量。
    Time.timeScale函数(时间缩放:默认值为1,游戏的暂停为0,游戏的快进可为2)。
    Time类详解

1.1.3 修改物体位置

  • 在Unity 中,修改物体位置实际上就是修改Transform(变换)组件的数据
  • Inspector窗口展示了组件的位置(Position)、旋转(Rotation)、缩放(Scale)参数
  • 在界面上可以修改的内容一定可以在脚本中修改,但在脚本中修改的内容不一定能在节目中修改,因为脚本的功能比界面展示的功能要多得多
  • 修改Transform组件中的Position的两种常用方法
    • 使用Translate()函数。
      即:tansform.Translate(x,y,z)。其中x、y、z为float类型量,若为常量要加上后缀f表示float类型,否则C# 认为其为double类型。如 3.12为double类型,3.12f为float类型。 (代码写于脚本函数中)
    • 直接指定新的位置
      即:tansform.position = new Vector3(x,y,z)。
    • 上述两种方法的区别:Translate函数默认为局部坐标系,而修改position的方法是世界坐标系。
  • 类型转换
    int可以隐式转换为float,所以x、y、z如果没有小数位可以不加f后缀,但int转float精度会降低(题外话)。
    类型转换
  • 位置移动代码
    void Update(){tansform.Translate(0,0,0.1f);tansform.position += new Vector3(0,0,0.1f);
    }
    
  • 游戏设计注意事项
     由于系统繁忙时无法保证稳定的帧率,因此对于上述代码,会导致小球的移动速度和帧率成正比。
    是“每帧移动距离相同”还是“每秒移动距离相同”呢?这需要根据游戏设计来确定,大多情况下是”每秒移动距离相同“,因此移动的距离应该针对帧率去确定,”每秒移动距离相同“的代码如下。

    void Update(){tansform.Translate(0,0,5*Time.deltaTime);tansform.position += new Vector3(0,0,5*Time.deltaTime);
    }
    

     代码中5表示速度,上述代码的改进原理基于:距离 = 速度 ✖ 时间 。两帧画面之间的变化基于两帧之间间隔的时间Time.deltaTime。要记住Updata函数是每帧执行

1.1.4 读取和处理输入