- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
通过脚本修改源资源
自动实例化
如果要修改任何游戏资源,通常希望在运行时修改,且修改是暂时的。例如,如果角色获得了无敌状态,可能想更改材质 (material) 的着色器 (shader),以便玩家角色形象地展示无敌的状态。该操作包含修改正在使用的材质。这种修改不是永久性的,因为我们不希望退出播放模式 (Play Mode) 时材质的着色器不同。
但是,在 Unity 中编写脚本永久修改源资源是可行的。我们从上面的材质示例开始说起。
若要临时更改材质的着色器,可更改材质 (material) 组件中的着色器 (shader) 属性。
private var invincibleShader = Shader.Find ("Specular"); function StartInvincibility { renderer.material.shader = invincibleShader; }
使用这段脚本并退出播放模式 (Play Mode) 时,材质 (material) 的状态将重置到最初进入播放模式 (Play Mode) 前的状态。出现这种情况是因为无论何时访问 renderer.material,材质都将自动实例化并返回实例。该实例自动、同时应用到渲染器中。所以可根据自己的意愿进行更改,不必担心性能问题。
直接修改
重要须知
下述方法将修改 Unity 中使用的真正源资源文件。这些修改无法撤销。请谨慎使用。
现在,假设我们不想退出播放模式时材质重置。要做到这一点,可使用 renderer.sharedMaterial。sharedMaterial 属性将返回该渲染器(和其他渲染器)使用的真正资源。
以下代码将永久更改高光 (Specular) 着色器使用的材质。不会将材质的状态重置到开始播放模式 (Play Mode) 前的状态。
private var invincibleShader = Shader.Find ("Specular"); function StartInvincibility { renderer.sharedMaterial.shader = invincibleShader; }
可以看出,对 sharedMaterial 做出任何的更改既有用又危险。这些更改将是永久性的,无法撤销。
适用的类成员
上述相同公式可应用至材质以外的项目。符合该要求的完整资源列表如下:
- 材质 (Materials):renderer.material 和 renderer.sharedMaterial
- 网格 (Meshes):meshFilter.mesh 和 meshFilter.sharedMesh
- 物理材质 (Physic Materials):collider.material 和 collider.sharedMaterial
直接指定
如果宣布一个以上任一类的公共变量:材质 (Materials)、网格 (Meshes) 或物理材质 (Physic Materials),并使用该变量而非相关的类成员修改资源,应用修改前不会获得自动实例化这一优势。
不自动实例化的资源
Desktop
有两种不同资源在修改时永远不会自动实例化。
- Texture2D
- TerrainData
通过脚本对这些资源所做的任何修改始终是永久性的,无法撤销。如果想通过脚本更改地形的高度图,就需要考虑实例化并自己指定值。纹理 (Textures) 也是如此。如果更改纹理文件的像素,那么这种更改是永久性的。
iOS
Texture2D 资源在修改时永远不会自动实例化。通过脚本对这些资源所做的任何修改始终是永久性的,无法撤销。如果更改纹理文件的像素,那么这种更改是永久性的。
Android
Texture2D 资源在修改时永远不会自动实例化。通过脚本对这些资源所做的任何修改始终是永久性的,无法撤销。如果更改纹理文件的像素,那么这种更改是永久性的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论