Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

这篇具有很好参考价值的文章主要介绍了Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip
Unity 脚本概览
脚本编写并不困难,但是如果直接从细节开始讲起,会让
读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写
的细节,只介绍简单的修改物体位置、处理用户输入和检测碰
撞的方法,让读者用最简单的方式做出第一个 3D 滚球跑酷游
戏,体会脚本编程的思路和整体方法。

1.1 控制物体的运动

仅通过控制物体的位置,就能做出好玩的小游戏。本节将
详细讲解创建脚本、改变物体位置和处理用户输入等基本操
作,并对容易产生误解的地方做出提示。

1.1.1 新建脚本

首先在场景中新建一个球体,接着新建脚本并挂载到该球
体上。
新建脚本有两种方法。第一种方法是在 Project (工程)窗
口的某个文件夹中,如在 Assets (资源根目录)中单击鼠标右
键,选择 Create→C# Script 选项,如图 1-1 所示。这时 Unity 会在
该文件夹下建立一个扩展名为 .cs 的脚本文件(扩展名在 Unity
辑器中是隐藏的),并立即让用户为其指定一个名称,默认为
NewScript
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-1 创建C#脚本
第二种方法是选中球体,在 Inspector (检视)窗口中单击
Add Component (添加组件)按钮,在菜单中选择 New script
(新建脚本)选项,再输入文件名,最后单击 Create and Add
(创建并添加)按钮,则会在 Assets 下新建指定名称的脚本文
件,如图 1-2 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-2 直接创建脚本Ball的方法
如果采用第一种方法,那么创建的脚本文件就还未挂载到
球体上。如果采用第二种方法,则在创建完成的同时脚本文件
也挂载完成了。
将脚本文件挂载到球体上也有两种方法:一是拖曳 Project
窗口中的脚本文件到场景中的球体上,二是拖曳 Project 窗口中 的脚本文件到 Inspector 窗口里所有项目的后面。推荐使用第二
种方法,因为它更为直观。
将脚本文件拖曳到 Inspector 窗口时会出现一条蓝色标记
线,代表插入的位置,如图 1-3 所示。一般来说脚本组件的顺序
不是很重要,可以插入到任意两个组件之间或者最后。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-3 插入脚本组件的操作
当不小心挂载了多个同样的脚本组件时,在组件名称上单
击鼠标右键,并选择 Remove Component (删除组件)选项即可
删除多余的组件,如图 1-4 所示
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-4 删除组件的操作
小提示
创建脚本组件的注意事项
Unity 规定,能够挂载到物体上的脚本文件必须是 脚本
组件 (另有一种不是组件的脚本文件),脚本组件要继承
MonoBehaviour ,且脚本代码中的 class 名称必须与文件名
一致。一般脚本创建时会自动生成这部分内容,但是如果修
改了脚本文件名,那么在挂载时就会报错。这时就必须修改
文件名或 class 名称,让它们一致,这样才能正确挂载。 Unity 支持一个物体挂载多个同样的脚本组件,但一般来
说只需要一个。如果由于操作失误挂载了多个脚本组件,就
要删除多余的,这也是建议把脚本文件拖曳到 Inspector 窗口
内的原因,这样易于确认是否挂载了多个脚本组件。

1.1.2 Start和Update事件

双击脚本文件,或者在脚本组件上单击鼠标右键,选择
Edit Script (编辑脚本),就可以打开脚本文件进行编辑。本书
建议使用 Visual Studio 2017 Visual Studio 2019 作为代码编辑
器。在初次安装 Unity 时会默认安装 Visual Studio 社区版,该版
本可免费使用。
打开脚本文件,可以看到如下内容。
using UnityEngine;

public class Ball : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
    }
}
这个脚本文件名为 Ball ,引用了 UnityEngine 这个命名空
间,组件类型为 Ball ,继承了 MonoBehaviour ,这些都是自动生
成的部分。这里需要关注的是其中的 Start() 函数和 Update()
数。
Start() 函数在游戏开始运行的时候执行一次,特别适合进行
组件初始化。而 Update() 函数每帧都会执行,在不同设备上更新
的频率有所区别,特别是当系统硬件资源不足时,帧率就会降
低,因此 Update() 函数实际执行的频率是变化的。
Start Update 又被称为 事件 ,因为它们分别是在 该组件
开始运行 更新该组件 这两个事件发生时被调用的。第 2
会详细讲解脚本组件的各种事件函数。
这里介绍一个非常常用的方法: Debug.Log() 用于向 Console
(控制台)窗口输出一串信息。下面改动脚本,加上两句输出 信息的代码。
using UnityEngine;

public class Ball : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        Debug.Log("组件执行开始函数!");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("当前游戏进行时间:" + Time.time);
    }
}
运行游戏,找到 Console 窗口,如果没有打开,则选择主菜
单中的 Window→General→Console 选项打开,如图 1-5 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-5 让Console窗口显示出来
执行游戏, Console 窗口内会产生大量信息,如图 1-6 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-6 Console窗口输出的信息
暂停游戏,查看 Console 窗口中的信息,发现开始函数只执
行了一次,后面所有的 当前游戏进行时间:秒数 都是 Update()
函数被调用时输出的。如果仔细观察,可以发现时间的流逝不
太稳定,特别是在游戏刚启动的时候偏差较大。
Debug.Log() 函数是写代码、查 bug 的好帮手,越是编程高
手,越是使用得多。 Debug.Log() 函数也是最简单、最可靠的一
种调试手段,未来还会反复使用这个方法,建议从现在开始就
多多应用它。

1.1.3 修改物体位置

Unity 里修改物体位置,实际上就是修改 Transform (变
换)组件的数据。在 Inspector 窗口里可以方便地查看和修改
Transform 组件的位置( Position )、旋转( Rotation )和缩放
Scale )参数,如图 1-7 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-7 查看和修改物体位置
在界面中可以修改的参数在脚本中也能修改,而在脚本中
可以修改的参数就不一定会在界面上出现了,因为脚本的功能
比界面上展示的功能要多得多。
修改 Transform 组件中的 Position 有两种常用方法。一种是使
Translate() 函数。
// 物体将沿着自身的右侧方向(X轴正方向也称为向右)前进1.5个单位
transform.Translate(1.5f, 0, 0);
另一种是直接指定新的位置。如果在游戏一开始就把物体
放在( 1, 2.5, 3 )的位置,则只需要修改 Start() 函数。
void Start () { 
 transform.position = new Vector3(1, 2.5f, 3);
}
这里可能有两个让人觉得奇怪的地方: “2.5” 要写作 “2.5f”
设置位置时要用 new Vector3(x, y, z) 这种写法。 这些主要源于 C# 语法的规定。直接写 2.5 会被认为是一个
double 类型的数,而这里需要的是 float 类型的数,所以必须加上
f 后缀。而写 “new” 的原因是 Vector3 是一个值类型,而 position
一个属性,由于 C# 中引用和值的原理,因此不能使
“transform.position.y = 2.5f” 这种写法直接修改物体的位置。这
里的解释可能对初学者来说有点模糊,不过没有关系,可以先
记住并使用这个语法,随着 C# 编程学习的深入自然会明白。
如果要做一个连续的位移动画,只需要让物体每帧都移动
一段很小的距离就可以了。也就是说,可以把改变位置的代码
写在 Update() 函数里,但是每帧都要比前一帧多改变一些位置。
例如,以下两种方法都可以让物体沿 z 轴前进。
void Update()
{
    transform.Translate(0, 0, 0.1f);
    // 在这个例子中等价于:
    transform.position += new Vector3(0, 0, 0.1f);
}
以上两句代码只选择写其中一句即可,另一句可以注释
掉。运行游戏,观察小球是否持续运动。
小提示
物体位置的两种写法有本质区别
如果深究,这里有两个要点:一是向量的使用和向量加
法,二是局部坐标系与世界坐标系之间的区别和联系。
Translate() 函数默认为局部坐标系,而修改 position 的方
法是世界坐标系。 3D 数学基础知识会在后续章节详细说明,
这里先把关注点放在位移逻辑上。
前面提到,由于系统繁忙时无法保证稳定的帧率,因此对
于上面的写法,如果帧率高,小球移动就快;帧率低,小球移
动就慢。我们需要在 每帧移动同样的距离 每秒移动同样的
距离 之间做出选择。
按游戏开发的常规方法,应当选择 每秒移动同样的距
。举个例子,如果帧率为 60 / 秒时物体每帧移动 0.01 米,那
么帧率只有 30 / 秒时就应该每帧移动 0.02 米,这样才能保证物 体移动 1 秒的距离都是 0.6 米。这里虽然原理复杂,但实际只需
要略作修改即可。
transform.Translate(0, 0, 5 * Time.deltaTime);
// 或
transform.position += new Vector3(0, 0, 5 * Time.deltaTime);
}
Time.deltaTime 表示两帧之间的间隔,如帧率为 60 / 秒时这
个值为 0.0167 秒,帧率只有 10 / 秒时这个值为 0.1 秒,用它乘以
移动速度就可以抵消帧率变化的影响。由于 Time.deltaTime 是一
个比较小的数,因此速度的数值应适当放大一些。

1.1.4 读取和处理输入

Unity 支持多种多样的输入设备,如键盘、鼠标、手柄、摇
杆、触摸屏等。很多输入设备有着类似的控制方式,如按键盘
上的 W 键或上箭头键,将手柄的左摇杆向前推,都代表
,用 Unity 的术语表述则是 沿纵轴( Vertical )向上 。以下
代码就可以获取用户当前的纵轴输入和横轴输入。
void Update()
{
    float v = Input.GetAxis("Vertical");
    float h = Input.GetAxis("Horizontal");
    Debug.Log("当前输入纵向:" + v + " " + "横向:" + h); 
}
Input.GetAxis() 函数的返回值是一个 float 类型的值,取值范
围为 -1~1 Unity 用这种方法将各种不同的输入方式统一在了一
起。
以上代码会输出 v h 的数值。运行游戏,然后按键盘上的
W A S D 键或方向键,查看 Console 窗口是否正确读取到了
输入值。
通过简单的乘法就可以将输入的幅度与物体运动的速度联
系起来。
void Update()
{
    float v = Input.GetAxis("Vertical");
    float h = Input.GetAxis("Horizontal");
    Debug.Log("当前输入纵向:" + v + " " + "横向:" + h);
    transform.Translate(h * 10 * Time.deltaTime, 0, v * 10 * Time.deltaTime);
}
代码解释:先取得当前的纵向、横向输入(取值范围
-1~1 ),然后将输入值与速度(代码中的数字 10 )和
Time.deltaTime 相乘,以控制物体的移动。每帧最小移动距离为
0 ,在 60 帧时 x 轴的每帧最大移动幅度是 1*10*0.0167 ,即 0.167
米, z 轴同理。
运行游戏,按 W A S D 键或方向键,看看效果。

1.1.5 实例:实现一个移动的小球

下面利用上面所讲解的内容,实现一个移动小球的案例,
具体操作如下。
01 新建一个球体。
02 调整摄像机的朝向和位置,可以设置为俯视、平视或斜
上方视角。
03 为球体创建脚本 Ball 并挂载,完整代码如下。
using UnityEngine;

public class Ball : MonoBehaviour
{
    public float speed = 10;

    void Start()
    {
    }

    void Update()
    {
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");
        transform.Translate(h * speed * Time.deltaTime, 0, v * speed * Time.deltaTime);
    }
}
04 运行游戏。单击 Game (游戏)窗口,然后按 W A
S D 键或方向键就可以看到球体以一定的速度移动了。运行游
戏的效果如图 1-8 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-8 控制小球移动
通过修改 Translate() 函数的参数,可以使球体沿不同方向移
动,如修改为以下代码就能实现沿 xy 平面移动,而不是沿 xz
面移动。
transform.Translate(h*speed*Time.deltaTime,
v*speed*Time.deltaTime, 0);
用这种写法修改速度非常方便,不需要反复修改代码。因
speed 是一个 public 字段( C# 中类的成员变量称为字段,两种
术语叫法,不影响理解), Unity 会为这种字段提供一个快捷的
修改方法。在场景中选中球体,在 Inspector 窗口中查看它的脚
本组件,如图 1-9 所示。
Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动,Unity 3D,游戏开发,Unity 3D游戏开发+脚本编程完整指南,unity,3d,游戏引擎
图1-9 脚本中的速度变量显示在面板中
读者会发现这里出现了一个 Speed 变量,值为 10 ,这就是脚
本中的 public float speed = 10 所带来的效果。由于在真实的游戏
开发过程中有很多参数需要设计师反复细致调节,因此 Unity
认将 public 字段直接放在界面上,用户可以随时修改速度,并且
被修改的参数会在下一次 Update() 函数执行时立即生效,也就是
说在游戏运行时也可以随时修改参数并生效。
唯一需要注意的是,如果游戏运行前 Speed 的值设定为 20
运行时改为了 30 ,那么停止运行游戏后, Speed 的值会回到 20
运行时的改动都不会被自动保存,需要在调整时记下合适的数
字,停止运行后手动修改。将参数显示到编辑器中还有更多技
巧,将在第 2 章继续讨论。
教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip

文章来源地址https://www.toymoban.com/news/detail-832828.html

到了这里,关于Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 3D脚本编程与游戏开发(2.6)

    4.5.2 四元数的概念         四元数包含⼀个标量分量和⼀个三维向量分量,四元数Q可以记作Q=[w,(x,y,z)]         在3D数学中使⽤单位四元数表⽰旋转,下⾯给出四元数的公式定义。对于三维空间中旋转轴为n,旋转⾓度为a的旋转,如果⽤四元数表⽰,则4个分量分别为

    2024年02月03日
    浏览(38)
  • Unity 3D脚本编程与游戏开发【4.2】

    8.2.3 ⾳频管理器         在实际游戏开发中,⾳效既是⼀个相对独⽴的部分,⼜与其他游戏逻辑密切关联。也就是说,与⾳效相关的代码会插⼊很多细节代码中。         ⽽且在⾳效⾮常丰富的情况下,如果每⼀个游戏模块都单独播放⾳效,那么可能会带来⼀些问题。

    2024年04月24日
    浏览(30)
  • Unity 3D脚本编程与游戏开发(2.8)

    5.1.2 矩形变换(Rect Transform)组件         如果选中界⾯上的控件,读者会发现每个物体并不带有基本的Transform组件,取⽽代之的是Rect Transform(矩形变换)组件。其实Rect Transform组件是Transform组件的⼦类,因此并不违反“每个物体必须有且只有⼀个Transform组件”的规定。

    2024年02月03日
    浏览(30)
  • Unity 3D脚本编程与游戏开发【4.0】

    7.2.3 DOTween插件使⽤⽅法简介 缓动动画既是⼀种编程技术,也是⼀种动画的设计思路。从设计⾓度来看,可以有以下描述。 ①事先设计很多基本的动画样式,如移动、缩放、旋转、变⾊和弹跳等。但这些动画都以抽象⽅式表⽰,⼀般封装为程序函数。 ②动画的参数可以在使⽤

    2024年04月09日
    浏览(38)
  • Unity 3D脚本编程与游戏开发(3.2)

    5.3.4 制作背包界⾯         背包界⾯是此实例中的重点,因为它的屏幕适配⽐较有代表性。当屏幕⽐较“瘦⾼”时,道具列表中能显⽰更多道具项,⽽屏幕⽐较“矮胖”时,显⽰的道具项会变少。但这些都不影响玩家通过下拉滑动查看所有道具,如图5-37所⽰。       

    2024年04月12日
    浏览(42)
  • Unity 3D脚本编程与游戏开发(2.5)

    4.3.4 向量的点积         两个向量的点积是⼀个标量,其数值为两者⻓度相乘,再乘以两者夹⾓的余弦: a·b=|a|·|b|cosθ⽤坐标表⽰,公式为 (x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2         注意到,两个向量的点积是⼀个数(标量),只有⼤⼩,没有⽅向。⽽且点乘满⾜交换律,

    2024年02月03日
    浏览(36)
  • Unity 3D脚本编程与游戏开发【4.1】

    7.2.5 后期处理举例 Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的⽀持。本⼩节以眩光(Bloom)为例,展⽰⼀种明亮的激光的制作⽅法,其效果如图7-13所⽰。 1. 安装后期处理扩展包         较新的Unity版本(如2018.4版本)已经内置了新版的后

    2024年04月26日
    浏览(27)
  • Unity 3D脚本编程与游戏开发(2.2)

    3.2.7 修改物理材质         每个物体都有着不同的摩擦⼒。光滑的冰⾯摩擦⼒很⼩,⽽地毯表⾯的摩擦⼒则很⼤。另外每种材料也有着不同的弹性,橡⽪表⾯的弹性⼤,硬质地⾯的弹性⼩。在Unity中这些现象都符合⽇常的理念。         虽然从原理上讲,物体的摩擦⼒

    2024年02月04日
    浏览(33)
  • Unity 3D脚本编程与游戏开发【3.7】

            在这个⾓⾊控制脚本中,可以看到很多新奇的写法。关键是,为什么要把移动量转化为转⾝量和前进量呢?要理解这个问题,⼀定要多进⾏游戏测试,体会转⾝与输⼊的关系。         当⾓⾊⾯朝前,输⼊朝后时,⾓⾊的前进量为0,转⾝量达到最⼤;⽽当⾓⾊

    2024年04月15日
    浏览(26)
  • 用Python做一个游戏辅助脚本,完整编程思路分享!

    一、说明 简述:本文将以4399小游戏《 宠物连连看经典版2 》作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对。对于有兴趣学习游戏脚本的同学有一定的帮助。 运行环境:Win10/Python3.5。 主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、num

    2024年02月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包