Unity 基础编程

news2025/2/12 2:04:03

在这个练习中将新建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 按键,运行游戏,操作扫地机搜集所有在地板上的小方块,实现采集物体效果,采集完后,退出游戏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot接入Deep Seek的API

1&#xff0c;首先进入deepseek的官网&#xff1a;DeepSeek | 深度求索&#xff0c;单击右上角的API开放平台。 2&#xff0c;单击API keys&#xff0c;创建一个API&#xff0c;创建完成务必复制&#xff01;&#xff01;不然关掉之后会看不看api key&#xff01;&#xff01;&…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入&#xff0c;运行对应的宏即可&#xff1b;会先MSGBOX提示一下&#xff0c;然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

C语言学习笔记:子函数的调用实现各个位的累加和

在C语言程序学习之初&#xff0c;我们都会学习如何打印 hello world&#xff0c;在学习时我们知道了int main&#xff08;&#xff09;是主函数&#xff0c;程序从main函数开始执行&#xff0c;这是流程控制的一部分内容。在主函数中我们想要实现一些功能&#xff0c;比如求各个…

grafana面板配置opentsdb

新增面板&#xff1a; 这里add-panel: 如果不是想新增面板而是想新增一行条目&#xff0c;则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator&#xff1a;聚合条件&#xff0c;区分下第一行和第二行的aggregator&#xff0c;第一个是对指标值的聚合&…

2025年02月10日Github流行趋势

项目名称&#xff1a;dify 项目地址url&#xff1a;https://github.com/langgenius/dify项目语言&#xff1a;TypeScript历史star数&#xff1a;64707今日star数&#xff1a;376项目维护者&#xff1a;takatost, crazywoola, laipz8200, iamjoel, JohnJyong项目简介&#xff1a…

Ansible简单介绍及用法

一、简介 Ansible是一个简单的自动化运维管理工具&#xff0c;基于Python语言实现&#xff0c;由Paramiko和PyYAML两个关键模块构建&#xff0c;可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…

渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…

HTML-day1(学习自用)

目录 一、HTML介绍 二、常用的标签 1、各级标题&#xff08;h1-h6&#xff09; 2、段落标签&#xff08;p&#xff09; 3、文本容器&#xff08;span&#xff09; 4、图片标签&#xff08;img&#xff09; 5、超链接标签&#xff08;a&#xff09; 6、表格&#xff08;t…

Vue07

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购物车数…

Godot开发框架探索#2

前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊&#xff0c;最近纠结的点有以下几个&#xff1a;1.渴求一个稳定的Godot开发框架&#xff1b;2.要不要使用更轻量的开发框架&#xff0c;或者直接写引擎&#xff1b; 3.对自己想做的游戏品类拿不定主意。…

deepseek实现私有知识库

前言 之前写了如何本地部署deepseek&#xff0c;已经可以私有化问答了&#xff0c;本地搭建deepseek实操&#xff08;ollama搭建&#xff0c;docker管理&#xff0c;open-webui使用&#xff09; 其中我觉得最厉害的还是这个模型蒸馏&#xff0c;使我们可以用很低的代价使用大模…

【探索未来科技】2025年国际学术会议前瞻

【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08; EIBDCT 2025&#xff09;代码示例&#xff1a;机器学习中的线性回…

大模型基本原理(四)——如何武装ChatGPT

传统的LLM存在几个短板&#xff1a;编造事实、计算不准确、数据过时等&#xff0c;为了应对这几个问题&#xff0c;可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG&#xff08;检索增强生成&#xff09; LLM生成的内容会受到训练…

开发完的小程序如何分包

好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1&#xff1a;java后端端口号 2&#xff1a;数据库类型 和 数据库所在服务器ip地址 3&#xff1a;服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1&#xff1a;column后变量名是数据库中存储的变量名 property的值是column值的…

iOS三方登录 - Facebook登录

引言 在出海APP的开发中&#xff0c;集成主流社交平台的三方登录已成为必不可少的一环。Facebook 作为全球最大的社交网络平台之一&#xff0c;其提供的 Facebook 登录功能能够大大简化用户注册和登录流程&#xff0c;提高用户体验&#xff0c;减少流失率。对于开发者而言&…

机器学习 - 理解偏差-方差分解

为了避免过拟合&#xff0c;我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高&#xff0c;容易导致过拟合。相反&#xff0c;如果限制模型的复杂度&#xff0c;降低其拟合能力&#xff0c;又可能会导致欠拟合。因此&#xff0c;如何在模型…

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09; 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…

PromptSource官方文档翻译

目录 核心概念解析 提示模板&#xff08;Prompt Template&#xff09; P3数据集 安装指南 基础安装&#xff08;仅使用提示&#xff09; 开发环境安装&#xff08;需创建提示&#xff09; API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…