Unity 基础编程

在这个练习中将新建unity脚本,控制player的运动与转动,实现用代码检测碰撞与删除物体。

该练习将应用附件中的项目文件,该文件与Unity快速练习的文件是同一个项目文件。

一、构建Player运动脚本

该部分将构建一个在场景中由玩家控制游戏物体移动的脚本。

1. 在Unity Hub中打开项目文件,然后再打开的 Unity 编辑器窗口,在Project窗口中点击 Assets > _Unity Essentials > Scenes 文件夹,在右侧窗口中双击 4_LivingRoom_Programming_Scene 打开场景,可以调整一下Scene窗口中看场景的角度,使得Scene和Game窗口中的所看的角度类似;

2. 在Project窗口中, 点击 Assets > _Unity Essentials > Prefabs > Charactoers 文件夹,在右侧选择一个游戏物体复用件(例如选择下图第5个,一个扫地机),拖拽该扫地机游戏物体到游戏场景中,放在地板上;

3. 在Project窗口中,点击 Assets > _Unity Essentials > Scripts 文件夹,然后在右侧的窗口中点击鼠标右键,在弹出的窗口中选择 Create > MonoBehaviour Script,然后点击该新建脚本的名称,名称将高亮,重新命名为 "PlayerController"

4. 用鼠标左键选中该新建的脚本,拖拽到场景中刚刚加入的扫地机游戏物体上,将新的脚本应用到这个游戏物体上,见下图

二、使用代码控制游戏物体的运动

5. 双击上面窗口中脚本文件,unity会在Visual Studio软件中打开该脚本文件,Visual Studio在安装Unity软件的时候,需要勾选安装,打开后的编程界面及代码如下图:

该界面代码中,左边的1,2,3。。。表示的是行数

第1 行 Using UnityEngine,表示使用了 UnityEngine 类

第3行 public class NewMonoBehaviourScript : MonoBehaviour,其中

  • public class NewMonoBehaviourScript 是定义了一个新的类 NewMonoBehaviourScript ,属性是public,可以被其他类调用
  •  MonoBehaviour 是这个新类的父类,所有unity的类默认是从MonoBehaviour 衍生而来的

第6行 void Start() 是每个新建的类中自动生成的函数,该函数定义了该脚本在生效开始时所能够做的事情,例如在代码里面定义一些初始变量;

第12行void Update()也是每个新建的类中自动生成的函数,该函数定义了该脚本所绑定的游戏物体,在游戏每帧更新的时候,所需要处理的事情,例如监听键盘输入;

6. 由于第3行中新的类名称 NewMonoBehaviourScript 和这个脚本文件的新命名 “PlayerController”不一致,需要更改这个新类名称为“PlayerController”;

7. 拷贝下面黑体的代码到脚本中, 注意大括号 “{  }” 的位置以及相互间的对应,然后保存

PlayerController 代码

/*************************************************************************/

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f; // 设置玩家player(这里指所绑定的扫地机游戏物体)的运动速度
    public float rotationSpeed = 120.0f; // 设置玩家player的转动速度

    private Rigidbody rb; // 定义 Rigidbody 变量 

    // Start is called before the first frame update
    private void Start()
    {
        rb = GetComponent<Rigidbody>(); // 用玩家 Rigidbody 属性复制 Rigidbody.
    }

    // Update is called once per frame
    void Update()
    {

    }


    // Handle physics-based movement and rotation.
    private void FixedUpdate()
    {
        // 移动基于玩家 player的垂直轴来移动.
        float moveVertical = Input.GetAxis("Vertical");  //获取垂直轴参数
        Vector3 movement = transform.forward * moveVertical * speed * Time.fixedDeltaTime; //获取每帧移动的距离,Time.fixedDeltaTime是指每帧的更新时间,transform.forward是指向前运动
        rb.MovePosition(rb.position + movement);  //MovePosition是指移动到所指定的位置,该位置由当前的位置与一帧所移动的距离之和和决定

        // 移动基于玩家 player的水平轴来转动.
        float turn = Input.GetAxis("Horizontal") * rotationSpeed * Time.fixedDeltaTime; //获取每帧所转动的角度,
        Quaternion turnRotation = Quaternion.Euler(0f, turn, 0f);//转换角度为一个四维数
        rb.MoveRotation(rb.rotation * turnRotation);//MoveRotation是指转动到所指定的角度,该角度由原来的角度与一帧所转动的角度之和和决定
    }

}

8. 返回Unity界面,这是会发现有一个弹窗在编译上述代码,编译完后,这个弹窗会自动消失,然后点击界面正中间上方的Play按键,开始游戏,分别按键盘的上下箭头按键控制扫地机前后运动,键盘的左右箭头按键控制扫地机的旋转,再次点击Play按键,退出游戏

9. 这步操作将Main Camera游戏物体作为扫地机游戏物体RobotVacuum_1的子物体,实现这个操作,在Hierarchy窗口中鼠标左键点击 Main Camera,然后拖拽该窗口中游戏物体到RobotVacuum_1名称上,见下图,

=》

10. 再次点击Play按键开始游戏,可以在左下方的游戏Game窗口中看到,摄像头视角会随着扫地机的位置和角度而改变,为了看的更清楚,可以将Main Camera的位置移动到扫地机的后上方,实现一个跟随扫地机的设置,见下图,再次点击Play按键,退出游戏

11. 在上述代码中定义了扫地机的运动和转动速度,这两个速度值可以在unity界面查看,见下图,在Hirarchy窗口中点击RobotVacuum_1游戏物体,然后在右侧Inspector窗口中的下方可以看到脚本属性中,Speed和Rotation Speed这两个变量。如果要改变速度值,可以直接在编辑窗口中更新。

三、使用代码使游戏物体自动旋转

该部分在场景中的地板上放置一些游戏物体(可以认为是房间地板上的垃圾物体),并驱动这些游戏物体自动旋转

12. 在Project窗口中点击  Assets > _Unity Essentials > Prefabs > Collectibles 文件夹,然后在右边窗口中鼠标左键点击第4个游戏物体 Collectible_Dirt,拖拽该游戏物体到Hirarchy窗口,将该游戏物体加入到游戏场景中;

13. 使用Scene窗口左侧的工具栏,将Collectible_Dirt游戏物体(一个小方块)放到扫地机前方的地板上,如下图所示

14. 重复上述第3个步骤,在_Unity Essentials > Prefabs > Scripts 文件夹中新建一个 Collectible脚本文件,见下图

15. 双击该新建的脚本文件在Visual studio中打开脚本,见下图,如果类的名称不是 Collectible,则更改名称,确保类的名称和脚本文件名称一致

16. 在代码中敲入如下黑体代码,然后保存

Collectible 代码

/*************************************************************************/

using UnityEngine;

public class Collectible : MonoBehaviour
{
    public float rotationSpeed; //定义一个旋转的角速度变量

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(0, rotationSpeed, 0);//沿着Y轴按定义的角速度值旋转该物体
    }
}
 

17. 回到Unity 界面,等待编译弹窗消失后,用鼠标左键将新建的 Collectible 脚本拖拽到 Hirarchy窗口中 Collectible_Dirt 上面,使得脚本绑定该游戏物体,然后点击Collectible_Dirt 游戏物体,可以在右侧的 Inspector 窗口的下方看到该脚本属性,其中rotationSpeed 的值默认为 0;

18. 点击整个界面正中间上方的 Play 按键,查看该游戏物体是否旋转? 可以看到物体时静止的,这是因为旋转的速度是 0,需要给其赋值一个大于0的值。

19. 再次点击Play按键,退出游戏,在Rotation Speed右边的编辑窗口中输入 0.5,然后再次点击Play按键, 看看游戏物体是否旋转了?可以看到该物体沿着垂直的Y轴不停的旋转。

20. 再次点击Play按键,退出游戏。保存(File > Save)整个场景,完成该部分练习。

四、采集游戏物体

该部分练习将实现扫地机收集地上的垃圾物体(及上述旋转的小方块),代码实现物体销毁、碰撞触发和物体消失的视觉效果。

21. 点击Play按键,操作扫地机碰撞上述旋转的小方块的时候,发现两个物体之间有一定的碰撞效果,但是小方块没有消失,不能实现收集垃圾的效果,再次点击Play按键,退出游戏;

22. 在Hirarchy窗口中选中 Collectible_Dirt游戏物体,在右侧Inspector窗口中 Box Collider 属性中激活 Is Trigger (点击其右边的框)

23. 双击Project窗口的 Collectible脚本,打开Visual studio,在脚本中加入如下代码

Trigger 进入函数

    private void OnTriggerEnter(Collider other)
    {
        //销毁这个游戏物体
        Destroy(gameObject);
    }

24. 点击Play按键,操作扫地机碰撞上述旋转的小方块的时候,发现小方块消失了,再次点击Play按键,退出游戏;

25. 在上述碰撞中,小方块直接消失了,在游戏中显得不够专业,这里需要添加一个消失的视觉效果。在Project窗口中 Prefabs > VFX 文件夹中包含5个VFX,选择一个3D效果,例如双击第3个VFX,在左侧Scene窗口边会出现VFX的预览窗口,显示该VFX,如果没看到的话,可以点击Play按键,再重复一次观看该爆炸效果。

26. 打开Visual Studio 编程界面,加入下列代码,注意代码的位置

定义变量

public GameObject onCollectEffect;//定义一个VFX游戏物体变量

27. 回到Unity界面,再Hirarchy窗口中Collectible_Dirt游戏物体,然后再选中将Project窗口中 Prefabs > VFX 文件夹中选定的VFX(例如上述查看的第3个VFX),将其拖拽到右侧Inspector窗口下方,脚本属性的 On Collect Effect 右边的编辑框中

28. 再次回到Visual Studio 界面,再脚本中加入如下代码,注意代码的位置,然后点击保存

新建一个VFX

// 新开一个VFX游戏物体,这是编程实现
Instantiate(onCollectEffect, transform.position, transform.rotation);

29. 回到 Unity 界面,等待弹窗编译接受后,点击正中间上方的 Play 按键,运行游戏,操作扫地机再次碰撞选装的小方块,可以看到一个爆炸的效果,再次点击 Play按键,退出游戏;

30. 下面在地板上杂乱的放多一些小方块垃圾。在Hirarchy窗口中双击03_Living_Room游戏物体,然后将Scene窗口左上方的坐标选择为 Global,在点击右上方的坐标轴(在上方的坐标轴),使得视角从顶部俯视整个房间,如果高度过高的话,可以使用鼠标中键,使得视角低一些,看清小方块;

31. 在Hirarchy窗口点击Collectible_Dirt在Scene窗口中该物体将高亮显示,再按键盘上的 Ctrl+D (macOS: Cmd+D),复制一个该游戏物体,可以多按几下按键,复制多个游戏物体;

32. 点击Scene窗口左侧的移动工具,再沿着一个选中方块的红色或蓝色坐标移动方块到自己想要的位置,放好后,在原来位置再选择一个小方块,移动到另外一个位置,重复操作,直至放好各个方块位置,如下图所示

33. 在Hirarchy窗口中选中所有的Collectible小方块游戏物体,点击鼠标右键,在弹出菜单中点击 Create Empty Parent将所有的小方块放置在一个空的游戏物体,使得Hirarchy窗口界面比较简洁及组织合理。

34. 重新命名该新的空游戏物体为 "Collectibles".

35. 点击Unity界面正中间上方的 Play 按键,运行游戏,操作扫地机搜集所有在地板上的小方块,实现采集物体效果,采集完后,退出游戏。

目前最火、最具发展前景的专业游戏引擎 Unity 3D是什么?Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎Unity3D的PC插件安装量达到2 亿 Unity全球注册用户已经达到200万,每月 Unity编辑器活跃开发者数量达到40万, Unity的PC插件安装量达到2亿! 未来游戏市场普遍呈现3D化 以手游市场为例,3D游戏占比达到80%,虽然现在还有不少2D游戏,但随着终端设备性能的提升和客户的需求增加,游戏市场最终会进入全面的3D化时代。Unity3D课程可以使你直接进入3D游戏开发领域,成为就业市场的宠儿。同时Unity3D也推出了开发2D游戏的插件,可以使我们从现在到未来都立于不败之地。 Unity 3D为什么这么火? ---真正的跨平台目前各个平台的游戏开发几乎没有通用性,开发iPhone上的游戏需要学习Objective C,开发Android上的游戏大多用Java,开发Windows Phone上的游戏用C#,……。如何只学习一种语言就能够开发出跨越多个平台的游戏呢?Unity3D使用底层Mono技术实现了真正的跨平台,而Mono是基于.NET框架开发的。他使我们使用一种语言就可以开发出基于各种平台的游戏,包括手机游戏(iPhone、Android、Windows Phone)、PC(Windows、Mac、Linux)、网页游戏(基于各种主流浏览器)、游戏机专用游戏(Wii、Xbox360、PS3) 现在Unity 3D的攻城狮的月薪基本上都在15000元以上,这是基础班,以后我再发精英班,学完后希望大家都可以找到年薪20万的工作。 这套是比较完整的课程,并且有实例课程,并且附带源码 并非其他只有基础的课程,没有实例! C#语言基础课程课时目录: 课时1 C#基础概述 课时2 创建一个C#文件 课时3 编译运行和控制台 课时4 创建你的第一个应用程序 课时5 变量 课时6 表达式 课时7 枚举 课时8 条件判断语句 课时9 for循环语句 课时10 while循环语句 课时11 函数 课时12 事件 课时13 C#进阶 课时14 类的概念 课时15 继承 课时16 MonoBehaviour 课时17 方法重写Overriding 课时18 方法重载Overloading 课时19 代理Delegates 课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity中的五种视图 课时7 Unity中的资源 课时8 Unity中的游戏物体 课时9 Unity中的组件Component 课时10 Unity中的场景Scene 课时11 场景中控制工具的使用 课时12 Unity中的本地坐标和世界坐标系 课时13 场景视图中的操作 课时14 向量 课时15 小结 基础入门之Roll-a-Ball滚动小球 课时1 Roll-A-Ball游戏介绍 课时2 了解基本集合体 课时3 创建游戏环境 课时4 给世界添加光 课时5 学习相机Camera 课时6 创建游戏主角 课时7 Unity中的刚体和碰撞器 课时8 Unity中的脚本编写 课时9 控制主角的移动 课时10 控制相机跟随 课时11 Transform组件 课时12 创建游戏中的食物 课时13 认识Prefab,完善场景中的食物 课时14 认识触发器 课时15 添加捡起食物功能 课时16 日志输出和错误调试 unity经典入门课程之C#基础实例讲解(打砖块实例) 课时1 开发工具Visual Studio Tools For Unity安装和介绍 课时2 项目效果预览,创建项目和第一个C#脚本 课时3 脚本挂载,控制台使用,变量声明和赋值,在舞台添加多个对象,使用脚本初始化对象 课时4 实例化方法高级应用,使用for循环语句创建多个砖块 课时5 课下作业-添加多行砖块 课时6 组件机制,刚体介绍,类型转换,函数返回值,发射小球功能实现 课时7 条件判断语句,鼠标按下事件处理,获取水平和垂直改变数值,改变对象位置,自动销毁对象 课时8 课程小结
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值