与游戏世界交互
1.编写一个简单的鼠标打飞碟(Hit UFO)游戏
-
游戏内容要求:
- 游戏有 n 个 round,每个 round 都包括10 次 trial;
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
- 每个 trial 的飞碟有随机性,总体难度随 round 上升;
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
-
游戏的要求:
- 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
- 近可能使用前面 MVC 结构实现人机交互与游戏模型分离
2.编写一个简单的自定义 Component
-
用自定义组件定义几种飞碟,做成预制
-
参考官方脚本手册 https://docs.unity3d.com/ScriptReference/Editor.html
-
实现自定义组件,编辑并赋予飞碟一些属性
我们可以通过从Editor基类派生,为自定义对象创建自定义检查器或编辑器。例如,使用自定义编辑器在检查器中更改脚本的外观。
设计自定义编辑器有多种方法。如果希望编辑器支持多对象编辑,可以使用CanEditMultipleObjects属性。使用SerializedObject和SerializedProperty系统来编辑脚本变量,而不是直接修改脚本变量,因为这将自动处理多对象编辑、撤消和预置覆盖。如果使用这种方法,用户可以在hierarchy窗口中选择多个资产,并一次性更改所有资产的值。
您可以使用uielement来构建自定义UI,也可以使用IMGUI。要使用uielement创建自定义检查器,您必须覆盖编辑器。编辑器类上的CreateInspectorGUI。要使用IMGUI创建自定义检查器,您必须覆盖编辑器。编辑器类上的OnInspectorGUI。如果你使用uielement和编辑器。CreateInspectorGUI覆盖,任何现有的IMGUI实现使用编辑器。同一编辑器上的OnInspectorGUI将被忽略。
-
-
实现自定义组件
参考官方例子,我们为上一题的游戏的 UFO进行编辑器扩展
-
使用IMGUI和多选功能的自定义检查器
SerializedObject和SerializedProperty是用于以完全通用的方式编辑Unity对象上的序列化字段的类。这些类自动处理弄脏的单个序列化字段,因此在检查器中绘制时,它们将由撤消系统处理并针对Prefab替代正确设置样式。
SerializedObject一次打开一个数据流到一个或多个目标Unity对象,这使您可以同时编辑对象共享的序列化数据。其中对应的是两个属性:
targetObject The inspected object (Read Only).
targetObjects The inspected objects (Read Only).SerializedObject和SerializedProperty类的最常见用法之一是在创建自定义编辑器时,其中建议使用SerializedObject,而不是直接修改检查的目标对象。
Example:using UnityEditor; using System.Collections; using System.Collections.Generic; using UnityEngine; // Custom Editor using SerializedProperties. // Automatic handling of multi-object editing, undo, and Prefab overrides [CustomEditor(typeof(UFO))] [CanEditMultipleObjects] public class UFOEditor : Editor { SerializedProperty AnimateSpeed; SerializedProperty Score; SerializedProperty DestinationPosition; SerializedProperty Color; void OnEnable() { // Setup the SerializedProperties. AnimateSpeed = serializedObject.FindProperty ("AnimateSpeed"); Score = serializedObject.FindProperty ("Score"); DestinationPosition = serializedObject.FindProperty ("DestinationPosition"); Color = serializedObject.FindProperty ("Color"); } public override void OnInspectorGUI() { // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. serializedObject.Update (); // Show the custom GUI controls. EditorGUILayout.IntField (new GUIContent ("Score"), Score.intValue); EditorGUILayout.FloatField(new GUIContent("Animate Speed"), AnimateSpeed.floatValue, GUIStyle.none); EditorGUILayout.Space (); EditorGUILayout.Vector3Field (new GUIContent ("Destination Position"), DestinationPosition.vector3Value); EditorGUILayout.ColorField(new GUIContent("Color"),Color.colorValue); // Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI. serializedObject.ApplyModifiedProperties (); } }
可以看到,我们为一个对象挂载上UFO类的脚本文件,再运行游戏,就可以在该对象的Inspector菜单中看到以下界面
-