目录
- 项目概述
- 🛠️ 完整操作步骤(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类
- 在Unity中新建项目(选择3D模板)
- 在Project窗口右键 → Create → Folder,命名为"Scripts"
- 在Scripts文件夹中右键 → Create → C# Script
- 命名为"ColorConfig"
- 双击打开并替换为以下代码:
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:创建颜色配置资产
-
在Project窗口中右键 → Create → Cube/Color Config
-
将新资产命名为"RedColor"
-
在Inspector中配置:
- Cube Color: 红色 (255, 0, 0)
- Emission Color: 深红 (100, 0, 0)
- Pulse Speed: 2
- Max Intensity: 3
- Color Name: 热情红
- Description: 充满活力的红色
-
同样方式创建另外两个配置:
- 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: 自然绿
- BlueColor
步骤3:创建Cube控制器
- 在Scripts文件夹创建新C#脚本,命名为"CubeController"
- 替换为以下代码:
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
- 创建新文件夹:Resources/ColorConfigs
- 将之前创建的三个颜色配置拖到ColorConfigs文件夹
- 在场景中创建Cube:
- GameObject → 3D Object → Cube
- 重命名为"ColorCube"
- 将CubeController脚本拖到Cube上
- 在Inspector中将RedColor配置拖到CubeController的Color Config字段
步骤5:添加简单UI提示
- 创建UI:GameObject → UI → Canvas
- 创建文本:右键Canvas → UI → Text
- 设置文本内容:
按数字键切换Cube颜色:
1 - 红色
2 - 蓝色
3 - 绿色
- 调整文本位置和大小(建议使用Anchor设置为底部居中)
步骤6:添加材质自发光支持
- 选择Cube
- 在Inspector中找到Material
- 确保材质勾选了"Emission"选项
- 如果没有,创建一个新材质:
- 右键Project窗口 → Create → Material
- 命名为"GlowMaterial"
- 勾选Emission
- 拖到Cube上
🎮 测试你的系统
- 点击Play按钮运行场景
- 观察Cube显示为红色并脉动
- 按键盘数字键:
- 按1:切换到红色
- 按2:切换到蓝色
- 按3:切换到绿色
- 观察效果:
- 每种颜色有不同的基础色和自发光
- 脉动速度各不相同
- 控制台显示当前颜色名称
💡 核心概念解析
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:添加旋转效果
- 在ColorConfig中添加旋转速度属性:
public Vector3 rotationSpeed; // 旋转速度
- 在CubeController的Update中添加:
transform.Rotate(colorConfig.rotationSpeed * Time.deltaTime);
- 为每个颜色配置设置不同的旋转速度
扩展2:创建随机颜色按钮
- 在UI中添加按钮
- 创建新方法:
public void SetRandomColor()
{ColorConfig[] allColors = Resources.LoadAll<ColorConfig>("ColorConfigs");if (allColors.Length > 0){colorConfig = allColors[Random.Range(0, allColors.Length)];ApplyColorConfig();}
}
扩展3:添加大小变化
- 在ColorConfig中添加:
public Vector3 cubeScale = Vector3.one; // Cube大小
- 在ApplyColorConfig中添加:
transform.localScale = colorConfig.cubeScale;
📚 实际应用场景
ScriptableObject在游戏开发中用途广泛:
- 敌人属性:不同敌人类型的血量、速度、伤害
- 武器系统:枪械的射速、伤害、后坐力
- 技能配置:冷却时间、效果强度、持续时间
- 游戏设置:难度级别、控制灵敏度
- 对话系统:NPC对话内容和选项
💎 总结
通过本教程,你学会了:
- 创建和使用ScriptableObject的基本流程
- 通过ScriptableObject分离数据和逻辑
- 动态加载和应用不同配置
- 创建简单的颜色动画效果
- 实现按键切换配置功能
ScriptableObject是Unity中提升工作效率的强大工具,它让游戏配置变得灵活可调,是每个Unity开发者都应该掌握的核心技能!