【Unity基础】Unity新手实战教程:用ScriptableObject控制Cube颜色

目录

    • 项目概述
    • 🛠️ 完整操作步骤(10分钟内完成)
      • 步骤1:创建ScriptableObject类
      • 步骤2:创建颜色配置资产
      • 步骤3:创建Cube控制器
      • 步骤4:设置场景和Cube
      • 步骤5:添加简单UI提示
      • 步骤6:添加材质自发光支持
    • 🎮 测试你的系统
    • 💡 核心概念解析
      • ScriptableObject是什么?
      • 为什么使用ScriptableObject?
      • 关键代码解析
    • 🚀 扩展练习
      • 扩展1:添加旋转效果
      • 扩展2:创建随机颜色按钮
      • 扩展3:添加大小变化
    • 📚 实际应用场景
    • 💎 总结

在这里插入图片描述

本教程将带你创建一个简单的Unity项目,使用ScriptableObject来控制Cube的颜色变化。这个示例非常适合Unity新手,只需要基本的Cube对象即可实现。

项目概述

我们将创建一个颜色配置系统:

  • 创建多个颜色配置(红、蓝、绿)
  • 将配置应用到Cube上
  • 实现按键切换不同颜色
  • 添加简单的颜色动画效果

🛠️ 完整操作步骤(10分钟内完成)

步骤1:创建ScriptableObject类

  1. 在Unity中新建项目(选择3D模板)
  2. 在Project窗口右键 → Create → Folder,命名为"Scripts"
  3. 在Scripts文件夹中右键 → Create → C# Script
  4. 命名为"ColorConfig"
  5. 双击打开并替换为以下代码:
using UnityEngine;// 创建资源菜单项
[CreateAssetMenu(fileName = "NewColor", menuName = "Cube/Color Config")]
public class ColorConfig : ScriptableObject
{[Header("颜色设置")]public Color cubeColor = Color.white;  // 基础颜色public Color emissionColor = Color.black; // 自发光颜色[Header("动画效果")]public float pulseSpeed = 1f; // 脉动速度public float maxIntensity = 2f; // 最大发光强度[Header("描述")]public string colorName; // 颜色名称[TextArea] public string description; // 描述文本
}

步骤2:创建颜色配置资产

  1. 在Project窗口中右键 → Create → Cube/Color Config

  2. 将新资产命名为"RedColor"

  3. 在Inspector中配置:

    • Cube Color: 红色 (255, 0, 0)
    • Emission Color: 深红 (100, 0, 0)
    • Pulse Speed: 2
    • Max Intensity: 3
    • Color Name: 热情红
    • Description: 充满活力的红色
  4. 同样方式创建另外两个配置:

    • BlueColor
      • Cube Color: 蓝色 (0, 100, 255)
      • Emission Color: 深蓝 (0, 0, 100)
      • Pulse Speed: 1.5
      • Max Intensity: 2.5
      • Color Name: 宁静蓝
    • GreenColor
      • Cube Color: 绿色 (0, 255, 100)
      • Emission Color: 深绿 (0, 100, 0)
      • Pulse Speed: 1
      • Max Intensity: 2
      • Color Name: 自然绿

步骤3:创建Cube控制器

  1. 在Scripts文件夹创建新C#脚本,命名为"CubeController"
  2. 替换为以下代码:
using UnityEngine;public class CubeController : MonoBehaviour
{[Header("颜色配置")]public ColorConfig colorConfig;private Material cubeMaterial;private float pulseTimer;void Start(){// 获取Cube的材质cubeMaterial = GetComponent<Renderer>().material;// 启用自发光cubeMaterial.EnableKeyword("_EMISSION");// 应用初始颜色配置ApplyColorConfig();}void Update(){// 应用脉动效果if (colorConfig != null && colorConfig.pulseSpeed > 0){pulseTimer += Time.deltaTime * colorConfig.pulseSpeed;float intensity = Mathf.Abs(Mathf.Sin(pulseTimer)) * colorConfig.maxIntensity;cubeMaterial.SetColor("_EmissionColor", colorConfig.emissionColor * intensity);}// 按键切换颜色if (Input.GetKeyDown(KeyCode.Alpha1)) SetColorConfig("RedColor");if (Input.GetKeyDown(KeyCode.Alpha2)) SetColorConfig("BlueColor");if (Input.GetKeyDown(KeyCode.Alpha3)) SetColorConfig("GreenColor");}// 应用颜色配置public void ApplyColorConfig(){if (colorConfig == null) return;cubeMaterial.color = colorConfig.cubeColor;cubeMaterial.SetColor("_EmissionColor", colorConfig.emissionColor);Debug.Log($"应用颜色配置: {colorConfig.colorName}");}// 通过名称设置颜色配置public void SetColorConfig(string configName){// 加载ScriptableObject资源ColorConfig newConfig = Resources.Load<ColorConfig>($"ColorConfigs/{configName}");if (newConfig != null){colorConfig = newConfig;ApplyColorConfig();}else{Debug.LogWarning($"找不到颜色配置: {configName}");}}
}

步骤4:设置场景和Cube

  1. 创建新文件夹:Resources/ColorConfigs
  2. 将之前创建的三个颜色配置拖到ColorConfigs文件夹
  3. 在场景中创建Cube:
    • GameObject → 3D Object → Cube
    • 重命名为"ColorCube"
  4. 将CubeController脚本拖到Cube上
  5. 在Inspector中将RedColor配置拖到CubeController的Color Config字段

步骤5:添加简单UI提示

  1. 创建UI:GameObject → UI → Canvas
  2. 创建文本:右键Canvas → UI → Text
  3. 设置文本内容:
按数字键切换Cube颜色:
1 - 红色
2 - 蓝色
3 - 绿色
  1. 调整文本位置和大小(建议使用Anchor设置为底部居中)

步骤6:添加材质自发光支持

  1. 选择Cube
  2. 在Inspector中找到Material
  3. 确保材质勾选了"Emission"选项
  4. 如果没有,创建一个新材质:
    • 右键Project窗口 → Create → Material
    • 命名为"GlowMaterial"
    • 勾选Emission
    • 拖到Cube上

🎮 测试你的系统

  1. 点击Play按钮运行场景
  2. 观察Cube显示为红色并脉动
  3. 按键盘数字键:
    • 按1:切换到红色
    • 按2:切换到蓝色
    • 按3:切换到绿色
  4. 观察效果:
    • 每种颜色有不同的基础色和自发光
    • 脉动速度各不相同
    • 控制台显示当前颜色名称

💡 核心概念解析

ScriptableObject是什么?

  • 数据容器:存储游戏配置和设置
  • 独立资源:保存在项目文件中(.asset格式)
  • 可复用:多个对象可共享同一配置
  • 编辑器友好:设计师可直接编辑数值

为什么使用ScriptableObject?

场景传统方法ScriptableObject方法
颜色配置在脚本中硬编码颜色值创建可编辑的颜色资产
修改配置需要修改代码并重新编译直接在Inspector中调整
多对象共享每个对象单独设置多个Cube共享同一配置
团队协作程序员需要设置所有参数设计师可自主创建配置

关键代码解析

// 创建资源菜单
[CreateAssetMenu(fileName = "NewColor", menuName = "Cube/Color Config")]
public class ColorConfig : ScriptableObject
{// 可配置属性public Color cubeColor;// ...其他属性
}
// 应用配置
public void ApplyColorConfig()
{cubeMaterial.color = colorConfig.cubeColor;// ...应用其他设置
}
// 动态加载配置
ColorConfig newConfig = Resources.Load<ColorConfig>($"ColorConfigs/{configName}");

🚀 扩展练习

学会了基础操作后,尝试以下扩展:

扩展1:添加旋转效果

  1. 在ColorConfig中添加旋转速度属性:
public Vector3 rotationSpeed; // 旋转速度
  1. 在CubeController的Update中添加:
transform.Rotate(colorConfig.rotationSpeed * Time.deltaTime);
  1. 为每个颜色配置设置不同的旋转速度

扩展2:创建随机颜色按钮

  1. 在UI中添加按钮
  2. 创建新方法:
public void SetRandomColor()
{ColorConfig[] allColors = Resources.LoadAll<ColorConfig>("ColorConfigs");if (allColors.Length > 0){colorConfig = allColors[Random.Range(0, allColors.Length)];ApplyColorConfig();}
}

扩展3:添加大小变化

  1. 在ColorConfig中添加:
public Vector3 cubeScale = Vector3.one; // Cube大小
  1. 在ApplyColorConfig中添加:
transform.localScale = colorConfig.cubeScale;

📚 实际应用场景

ScriptableObject在游戏开发中用途广泛:

  1. 敌人属性:不同敌人类型的血量、速度、伤害
  2. 武器系统:枪械的射速、伤害、后坐力
  3. 技能配置:冷却时间、效果强度、持续时间
  4. 游戏设置:难度级别、控制灵敏度
  5. 对话系统:NPC对话内容和选项

💎 总结

通过本教程,你学会了:

  • 创建和使用ScriptableObject的基本流程
  • 通过ScriptableObject分离数据和逻辑
  • 动态加载和应用不同配置
  • 创建简单的颜色动画效果
  • 实现按键切换配置功能

ScriptableObject是Unity中提升工作效率的强大工具,它让游戏配置变得灵活可调,是每个Unity开发者都应该掌握的核心技能!

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

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

相关文章

One Year~

入局 作为科班学生&#xff0c;没事就在CSDN闲逛&#xff0c;只作为旁观者的身份去体会别人的好文。当时也没想着说去自己写一些博客记录学习过程。相信大多数同学和我有一样的心理。 但在看鱼皮哥的课程时&#xff0c;发现他有着写文档和博客的习惯&#xff0c;整理自己的思路…

【Redis】第3节|深入理解Redis线程模型

一、Redis基础认知 &#xff08;一&#xff09;定义与定位 Redis&#xff08;Remote Dictionary Server&#xff09;是开源高性能键值数据库&#xff0c;核心特点如下&#xff1a; 数据结构丰富&#xff1a;支持字符串、哈希、列表、集合、有序集合等复杂数据类型&#xff0…

vben-admin 2.8.0 版本修改 axios响应处理逻辑

此前端框架下的 Axios 在后端返回的结果老是无法正常解析&#xff0c;找到他源码的封装类&#xff0c;修正这个问题 文件位于 src\utils\http\axios\index.ts 修改前 transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) > {const { t }…

深入理解JavaScript设计模式之原型模式

目录 前言引入原型模式头脑风暴传统方式 vs 原型模式实战案例&#xff1a;飞机大战中的分身术 原型模式实现的关键秘密实战演练&#xff1a;造一架能分身的飞机克隆是创建对象的手段原型模式&#xff1a;轻装上阵的造物术 原型编程范型的一些规则原型编程的四大门规&#xff1a…

【数据库】概述(纯理论)

数据库系统引论 数据管理系统的发展 数据管理&#xff1a;对数据分类、组织、编码、存储、检索、维护 发展&#xff1a;人工管理、文件系统、数据库系统 40-50年代 人工管理 数据不保存&#xff0c;没有专门软件管理数据&#xff0c;应用程序完全依赖于数据&#xff0c;数据…

语音合成之十七 语音合成(TTS)中文自然度:问题、成因、解决方案

语音合成&#xff08;TTS&#xff09;中文自然度&#xff1a;问题、成因、解决方案 中文TTS系统基本架构中文TTS常见问题深度剖析与解决方案音色跳变成因分析解决方案 声调与重读错误成因分析业界解决方案 漏读与断句错误成因分析业界解决方案 在跨语言TTS系统比较中&#xff0…

我在 Linux 进程管理中踩过的坑:僵尸、瞬时与不可中断进程实战实录

作为运维老鸟&#xff0c;我曾在 Linux 进程管理上栽过不少跟头。记得第一次遇到满屏僵尸进程时&#xff0c;服务器直接卡到连 SSH 都登不上&#xff0c;看着ps命令里一排排刺眼的Z状态进程&#xff0c;手心直冒冷汗。后来又碰到过瞬时进程搞崩日志系统&#xff0c;明明监控显示…

【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结

工厂模式三种类型&#xff1a; 一、简单工厂模式&#xff08;Simple Factory&#xff09; 定义&#xff1a; 用一个工厂类&#xff0c;根据传入的参数决定创建哪一种具体产品类实例。 面试说法&#xff1a; 由一个统一的工厂创建所有对象&#xff0c;增加新产品时需要修改工…

某标杆房企BI平台2.0升级实践

当房地产行业从“规模竞赛”转向“精益运营”&#xff0c;数字化转型成为破局关键。某千亿房企携手亿信华辰&#xff0c;以“用数据重构业务价值链”为目标&#xff0c;历经6个月完成BI平台战略性升级。在这场从“数据可视化”到“决策智能化”的跃迁中&#xff0c;亿信华辰ABI…

Lua 脚本在 Redis 中的运用-24 (使用 Lua 脚本实现原子计数器)

实践练习:使用 Lua 脚本实现原子计数器 实现原子计数器是许多应用程序中的常见需求,例如跟踪网站访问量、限制 API 请求或管理库存。虽然 Redis 提供了 INCR 命令用于递增整数,但在复杂场景或与其他操作结合时直接使用它可能并不足够。本课程探讨了如何在 Redis 中利用 Lua…

Rust 学习笔记:使用迭代器改进 minigrep

Rust 学习笔记&#xff1a;使用迭代器改进 minigrep Rust 学习笔记&#xff1a;使用迭代器改进 minigrep不使用 clone&#xff0c;而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记&#xff1a;使用迭代器改进 minigrep 前情提要&#xff1…

el-table配置表头固定而且高度变化

根据官网提示只要在 el-table 元素中定义了 height 属性&#xff0c;即可实现固定表头的表格&#xff0c;而不需要额外的代码。 如果你想既要固定表头&#xff0c;又要下方表格高度自适应&#xff0c;可以设置为 height"100%" &#xff1a; 然后外层设置scroll:

弱光环境下如何手持相机拍摄静物:摄影曝光之等效曝光认知

写在前面 博文内容为一次博物馆静物拍摄笔记的简单总结内容涉及&#xff1a;弱光环境拍摄静物如何选择&#xff0c;以及等效曝光的认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货&#xff0c;感兴趣小伙伴可以关注下 _ 采…

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令&#xff0c;由于这些指令不形成机器码指令&#xff0c;它们只是在汇编器进行汇编工作的过程中起作用&#xff0c;所以被叫做伪指令。 4.1.2 伪指令特征 …

智能手表怎么申请欧盟EN 18031认证

智能手表申请欧盟 EN 18031 认证&#xff08;针对消费类物联网设备的网络安全标准&#xff09;的流程与智能门锁类似&#xff0c;但需结合手表的功能特性&#xff08;如数据交互、定位、支付等&#xff09;调整合规重点。以下是具体流程和关键要点&#xff1a; 一、标准适配与…

算法-全排列

1、全排列函数的使用 举例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面试加分秘籍:校招数据倾斜场景下的SQL优化方案

校招面试经常会问大家有没有过调优的经验&#xff0c;相信大家的回答基本都是往数据倾斜和小文件问题这两方面回答&#xff0c;对于数据倾斜相信大部分同学对热key打散或null值引发的倾斜已经非常熟悉&#xff0c;但这些内容面试官也是听腻了&#xff0c;希望大家在面试时候讲一…

Elasticsearch索引机制与Lucene段合并策略深度解析

引言 在现代分布式搜索引擎Elasticsearch中&#xff0c;文档的索引、更新和删除操作不仅是用户交互的核心入口&#xff0c;更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开&#xff1a; 文档生命周期管理&#xff1a;从客户端请求路由到分片定位&#xff0c;从内存…

git提交更改

第一步&#xff1a;添加改动 git add . 第二步&#xff1a;提交改动 git commit -m “替换了 SerialPort 库文件” 第三步&#xff1a;推送到远程 git push 为什么git 的UI界面做的远不如SVN

WPF的基础控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation属性2 DockPanel的LastChildFill3 嵌套布局示例4 性能优化建议5 常见问题排查 在WPF开发中&#xff0c;布局控件是构建用户界面的基石。StackPanel和DockPanel作为两种最基础的布局容器&…