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

article/2025/8/22 7:52:24

目录

    • 项目概述
    • 🛠️ 完整操作步骤(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.hkcw.cn/article/cWlysBiZMG.shtml

相关文章

美宣布撤销中国留学生签证 我使馆:已提出严正交涉

美方宣布撤销中国留学生签证 我使馆:已提出严正交涉关于美国务院发表声明称将撤销有关中国在美留学生签证一事,中国驻美使馆发言人5月29日在回答媒体提问时表示,中方坚决反对美方这一政治性、歧视性做法。中国驻美使馆表示,美方此举将严重损害中国在美留学人员正当合法权益…

硅基计划2.0 学习总结 伍 类的继承 初稿

文章目录 一、 继承1. 为什么要继承2. 如何继承3. 情况一&#xff1a;子父类成员变量重名4. 情况二&#xff1a;子父类成员方法重名5. 子父类构造方法问题6. 继承中代码块调用顺序7. protected关键字7. 继承方式8. final关键字9. 继承和组合 一、 继承 1. 为什么要继承 假设一…

长安链合约操作 查询合约命令解析

这个命令使用 ChainMaker 的 cmc 客户端工具查询智能合约 fact 的 find_by_file_hash 方法&#xff0c;通过文件哈希值检索链上存储的数据。以下是详细解析&#xff1a; 命令功能 调用合约 fact 的 查询方法 find_by_file_hash&#xff0c;根据文件哈希值 ab3456df5799b87c77…

嵌入式开发之STM32学习笔记day15

STM32F103C8T6 USART串口协议 1 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 …

Java版本的VPN(wlcn)1.3.1-JDK17-SNAPSHOT

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 版本更新 1…

javaweb 前言

Web的发展历史 Web的诞生 (1989-1991)&#xff1a; 1989年&#xff0c;欧洲核子研究组织&#xff08;CERN&#xff09;的蒂姆伯纳斯-李提出了World Wide Web的概念&#xff0c;并发明了统一资源定位符&#xff08;URL&#xff09;、超文本传输协议&#xff08;HTTP&#xff09…

<el-date-picker>配置禁用指定日期之前的时间选择(Vue2+Vue3)

今天突然接受到一个离谱的需求&#xff1a;有一个需要配置定时任务开始执行时间的组件&#xff0c;之前的做法都是用<el-form>的rules定义校验规则&#xff0c;也能实现效果&#xff0c;但是今天产品突发奇想&#xff1a;不能选的时间就置灰&#xff08;就是我们说的禁用…

Redis 主从节点

Redis 主从节点的核心区别 特性主节点 (Master)从节点 (Slave/Replica)读写权限可读可写只读&#xff08;默认配置&#xff09;数据流向数据来源从主节点同步数据连接关系可连接多个从节点只能连接一个主节点故障切换故障时需要手动/自动提升从节点可被提升为新的主节点命令执…

[NOIP 2001 普及组] 数的计算 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.close();int[] arr new int[n 1]; // 存储第i个数对应的合法数列数for (int i 1; i < n; i) {arr[i]; // 只有一个数n的数列…

【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”

2025年X月X日,布里斯托大学的Akhil S. Kumar等人在《Nature Electronics》期刊发表了题为《Gallium nitride multichannel devices with latch-induced sub-60-mV-per-decade subthreshold slopes for radiofrequency applications》的文章,基于AlGaN/GaN超晶格多通道场效应晶…

Vue-Router 基础使用

Vue Router 是 Vue 官方的客户端路由解决方案。 客户端路由的作用是在单页应用 SPA 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时&#xff0c;URL 会随之更新&#xff0c;但页面不需要从服务器重新加载。 Vue Router 基于 Vue 的组件系统构建&a…

Linux服务器时间同步——Chronyd

需求&#xff1a;现有三台服务器&#xff0c;想要确保服务器间时间保持一致。 一、安装Chronyd 确认是否安装了chronyd服务 systemctl status chronyd 如果Linux系统中没有安装&#xff0c;可以通过如下命令进行安装&#xff1a; yum install chrony -y 注&#xff1a;确保…

手机实名认证接口如何用C#进行调用?

一、什么是手机实名认证接口&#xff1f; 通过输入用户的姓名与手机号码&#xff0c;或手机号与身份证号码&#xff0c;验证三者之间的匹配关系&#xff0c;从而判断该手机号是否属于指定用户本人。 二、为什么需要运营商二要素验证&#xff1f;传统方式有哪些局限&#xff1…

springboot多模块父pom打包正常,单模块报错

背景&#xff1a;因为项目开发中经常发测试环境&#xff0c;发现使用阿里的插件能一键上传&#xff0c;不用手动上传比较方便。但是多模块有多个启动jar的时候&#xff0c;全局打包太慢&#xff0c;单独打发现报错。这里贴一下我使用这个插件的方式&#xff1a; 附带一个我感觉…

硬件同步机制-Swap指令实现互斥的基本讲解

Swap 指令 Swap指令能原子地交换两个变量的值 &#xff0c;即这一操作不可分割、不会被中断。其代码逻辑为&#xff1a; boolean temp *a; &#xff1a;创建一个临时变量temp &#xff0c;将变量a的值暂存到temp中 。*a *b; &#xff1a;把变量b的值赋给变量a 。*b temp; &…

中国国运新引擎:下一代液晶技术突破如何重塑全球显示格局

一、国运崛起&#xff1a;中国在未来关键领域的集体突破 在全球科技竞争白热化的当下&#xff0c;中国正迎来关键领域的集中爆发。从新能源汽车到 5G 通信&#xff0c;从量子计算到航天工程&#xff0c;中国不仅打破了西方的技术封锁&#xff0c;更在多个战略领域实现了从 “跟…

在雄性小鼠自发脑网络中定位记忆巩固的因果中枢

目录 简要总结 摘要 1 引言 2 方法 3 结果 简要总结 这篇文章主要研究了雄性小鼠在自发脑网络中记忆巩固的因果中枢定位。记忆巩固涉及学习后休息和睡眠期间全脑网络的自发重组&#xff0c;但具体机制尚不清楚。目前理论认为海马体在这一过程中至关重要&#xff0c;但其他…

美国威胁退出俄乌冲突调解

△联合国安理会(资料图)当地时间5月29日,美国告知联合国安理会,如果俄罗斯决定继续在乌克兰进行军事行动,美国将不得不考虑退出旨在结束冲突的谈判努力。美国表示,目前提出的协议是对俄罗斯最好的结果,俄罗斯总统普京应该接受。此外,对俄罗斯的额外制裁仍在讨论中。美国…

flutter项目迁移空安全

重中之重 备份好项目文件&#xff0c;甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本&#xff0c;这样做既有基本的库兼容问题&#xff0c;又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误&#xff0c;一片报错的…

单亲妈妈抗癌6年去世 生命旅程的坚韧与无奈

单亲妈妈抗癌6年去世 生命旅程的坚韧与无奈!5月28日晚,浙江的单亲妈妈张潇群因结肠癌去世,年仅37岁。她在网络上是一位知名的抗癌博主,无数人关注着她的抗癌历程,从确诊到治疗的过程充满艰辛。浏览她的社交媒体,仿佛走进了一场关于疼痛的独白,无论是病痛的呻吟还是求生的…