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 基础编程
在这个练习中将新建unity脚本,控制player的运动与转动,实现用代码检测碰撞与删除物体。 该练习将应用附件中的项目文件,该文件与Unity快速练习的文件是同一个项目文件。 一、构建Player运动脚本 该部分将构建一个在场景中由玩家控制游戏物…...
Spring Boot接入Deep Seek的API
1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...
介绍下SpringBoot常用的依赖项
Spring Boot 是一个用于快速开发 Spring 应用程序的框架,它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项: 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序,包括 RESTful 服务。依赖项: spr…...
解决 keep-alive 缓存组件中定时器干扰问题
当使用 keep-alive 缓存组件时,组件中的定时器可能会在组件被缓存后继续运行,从而干扰其他组件的逻辑。为了避免这种情况,可以通过以下方法解决: 1. 在组件的 deactivated 钩子中清理定时器 keep-alive 为缓存的组件提供了 acti…...
PostgreSQL插件-pg_stat_statements-安装和使用
文章目录 插件介绍插件安装1.修改配置文件postgresql.conf2.插件相关参数参数默认值参数说明特别注意pg_stat_statements.max参数设置太小日志会有警告 插件使用1.创建插件2.使用插件3.重置数据4.删除插件 可能会出现的问题1.没有编译安装插件2.没有配置shared_preload_librari…...
flutter安卓打包签名
flutter安卓打包签名 1.创建签名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一个用于管理密钥和证书的命令行工具,通常与 Java 开发工具包 (JDK) 一起使用。my-release-…...
从Word里面用VBA调用NVIDIA的免费DeepSeekR1
看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…...
JavaScript 中的防抖和节流,它们的区别是什么,以及如何实现?
在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的优化高频率事件处理的技术。 它们能够有效减少事件处理函数的执行次数,从而提升页面性能和用户体验。 下面将详细解释这两种技术的概念、区别、…...
【Kubernetes的SpringCloud最佳实践】Spring Cloud netflix 能否被K8s资源完全替代?
在部署Spring Cloud微服务到Kubernetes(K8s)时, Spring Cloud netflix 是否需要完全替代?或者可以部分替代,结合使用? 例如,服务发现和负载均衡可以交给K8s处理, 但某些功能如API网关…...
MATLAB中extract 函数用法
目录 语法 说明 示例 从地址中提取邮政编码 提取在数值位置处的字符 extract函数的功能是从字符串中提取子字符串。 语法 newStr extract(str,pat) newStr extract(str,pos) 说明 newStr extract(str,pat) 返回 str 中与 pat 指定的模式匹配的任何子字符串。 如果 s…...
DeepSeek-V3:开源多模态大模型的突破与未来
目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3? 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...
C语言学习笔记:子函数的调用实现各个位的累加和
在C语言程序学习之初,我们都会学习如何打印 hello world,在学习时我们知道了int main()是主函数,程序从main函数开始执行,这是流程控制的一部分内容。在主函数中我们想要实现一些功能,比如求各个…...
docker安装ollama显示超时或失败
正常安装 1、拉取ollma镜像 docker pull ollama/ollama or docker pull docker.1panel.live/ollama/ollama2、运行ollma镜像 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama3、运行指定大模型:模型仓库参考网站: library (ollama.com…...
grafana面板配置opentsdb
新增面板: 这里add-panel: 如果不是想新增面板而是想新增一行条目,则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator:聚合条件,区分下第一行和第二行的aggregator,第一个是对指标值的聚合&…...
iOS AES/CBC/CTR加解密以及AES-CMAC
感觉iOS自带的CryptoKit不好用,有个第三方库CryptoSwift还不错,好巧不巧,清理过Xcode缓存后死活下载不下来,当然也可以自己编译个Framework,但是偏偏不想用第三方库了,于是研究了一下,自带的Com…...
使用Jenkins实现鸿蒙HAR应用的自动化构建打包
使用Jenkins实现鸿蒙HAR应用的自动化构建打包 在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现…...
2025年02月10日Github流行趋势
项目名称:dify 项目地址url:https://github.com/langgenius/dify项目语言:TypeScript历史star数:64707今日star数:376项目维护者:takatost, crazywoola, laipz8200, iamjoel, JohnJyong项目简介:…...
Ansible简单介绍及用法
一、简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...
渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)
Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…...
HTML-day1(学习自用)
目录 一、HTML介绍 二、常用的标签 1、各级标题(h1-h6) 2、段落标签(p) 3、文本容器(span) 4、图片标签(img) 5、超链接标签(a) 6、表格(t…...
Vue07
一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…...
Godot开发框架探索#2
前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊,最近纠结的点有以下几个:1.渴求一个稳定的Godot开发框架;2.要不要使用更轻量的开发框架,或者直接写引擎; 3.对自己想做的游戏品类拿不定主意。…...
deepseek实现私有知识库
前言 之前写了如何本地部署deepseek,已经可以私有化问答了,本地搭建deepseek实操(ollama搭建,docker管理,open-webui使用) 其中我觉得最厉害的还是这个模型蒸馏,使我们可以用很低的代价使用大模…...
2.10学习总结
Dijkstra算法求取最短路径 注:迪杰斯特拉算法并不能直接生成最短路径,但是算法将最短路径信息保存在dist数组和path数组中。 dist数组中保存的是起始点到数组下标对应顶点的路径长度(累加的结果)path数组中保存的是对应path数组…...
【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...
pytest.fixture
pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...
大模型基本原理(四)——如何武装ChatGPT
传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…...
开发完的小程序如何分包
好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…...
java配置api,vue网页调用api从oracle数据库读取数据
一、主入口文件 1:java后端端口号 2:数据库类型 和 数据库所在服务器ip地址 3:服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1:column后变量名是数据库中存储的变量名 property的值是column值的…...
iOS三方登录 - Facebook登录
引言 在出海APP的开发中,集成主流社交平台的三方登录已成为必不可少的一环。Facebook 作为全球最大的社交网络平台之一,其提供的 Facebook 登录功能能够大大简化用户注册和登录流程,提高用户体验,减少流失率。对于开发者而言&…...
