与游戏世界交互

与游戏世界交互

1.编写一个简单的鼠标打飞碟(Hit UFO)游戏

  • 游戏内容要求:

    1. 游戏有 n 个 round,每个 round 都包括10 次 trial;
    2. 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
    3. 每个 trial 的飞碟有随机性,总体难度随 round 上升;
    4. 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
  • 游戏的要求:

    • 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
    • 近可能使用前面 MVC 结构实现人机交互与游戏模型分离

    具体项目及报告到Github中查看

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菜单中看到以下界面

      gui

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值