menu 宵夜律者's Blog
2021年2月
message
2021-02-27 18:56:00
方法/模式优点缺点
Convert  And Destroy转换后 删除 原有 GameObject1.转化为 Entity 后在 Hierarchy 面板将
2.无法调试部分无法被转化的组件将会被删除
Convert And Inject GameObject转换后 保留 原有 GameObject1.由于原 GameObject 没有被删除,会出现两个物体的情况
2.无法对子层级同时进行转化
Destroy & Inject 混合使用包含 Destroy 与 Inject 的优点1.转化为 Entity 后在 Hierarchy 面板将无法调试
2.由于原 GameObject 没有被删除,会出现两个物体的情况
Companion Game Object伴随方法可以指定 GameObject 组件不被转化为 Entity 的组件,兼容 Prefab 1.转化为 Entity 后在 Hierarchy 面板将无法调试
SubScene可以将整个场景直接转化为 Entity,且可以在 Hierarchy 面板直接进行调试

方法一 — 通过给 GameObject 挂载 Convert To Entity 组件来进行转换

挂载后,运行时将会自动转化为 Entity ,但并非所有组件都能被转化为 Entity 的 Component
可以通过更改 Conversion Mode 来更改转化的模式
Convert And Destroy 模式会将该 GameObject 的子层级一并转化,且保持父子级关系,但如遇到无法转化的组件时会直接删除
Convert And Inject Game Object 模式在转化时会保留原有组件,但会导致 Mesh Renderer 与 Hybrid Renderer 同时渲染,出现两个相同物体的情况,同时该模式无法转化子层级对象

方法二 — Destroy & Inject 混合使用

父物体与子物体同时挂载 Convert To Entity 组件
父物体为 Destroy 模式,子物体为 Inject 模式 (经测试,父物体为 Inject,子物体为 Destroy 时,子物体将不会进行转化)
此时将会同时获得两种模式的好处,在保持父子级关系的同时,子物体的组件会被保留

方法三 — 继承 IConvertGameObjectToEntity 接口,实现 Convert 方法

该方法通常用于编写 Authoring ,在 Convert 可以加入我们想要在转化时同时加入的 Component 信息
这样我们可以还在 Inspector 窗口更改参数,方便调试
注意:GameObject 依然需要挂载 Convert To Entity 组件
示例:

public struct CameraAimInfo : IComponentData {
    public float distance;
    public float theta;
}

public class CameraAuthoring : MonoBehaviour, IConvertGameObjectToEntity {
    public float distance;
    public float theta;

public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) {
        dstManager.AddComponentData(entity, new CameraAimInfo() {
            distance = distance,
            theta = theta
        });
    }
}

方法四 — Companion Game Object 伴随方法

它会创建一个新的 GameObject 来"伴随"(companion)被转换的数据,并用它来选择你想保留的组件

当我们的 GameObject 中有几个不想被转化或无法转化的组件时,可以使用 AddHybridComponent 这个方法

示例:

public class Test : MonoBehaviour, IConvertGameObjectToEntity {
    public Button button;
    public Image image;
    public Text text;
    public ParticleSystem particleCompanion;
    public ParticleSystemRenderer rendererCompanion;

public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) {
    conversionSystem.AddHybridComponent(button);
    conversionSystem.AddHybridComponent(text);
    conversionSystem.AddHybridComponent(image);
    conversionSystem.AddHybridComponent(particleCompanion);
    conversionSystem.AddHybridComponent(rendererCompanion);
    }
}

方法五 — [GenerateAuthoringComponent]

这个并不算转化方法,只是能够在转化的时候更方便的加上 Component
可以通过添加  [GenerateAuthoringComponent] 属性标签让 ComponentData 可以被直接挂载

注意:字段的访问类型必须为 public,且依然需要挂载 Convert To Entity

示例:

[GenerateAuthoringComponent]
public struct SpeedComponent : IComponentData {
    public float speed;
}

[GenerateAuthoringComponent]
public struct TagPlayer : IComponentData {}

GenerateAuthoringComponent测试.png

方法六 — 使用 SubScene 组件可以实现整个场景的 Entity 转化

通过 SubScene 转化的物体可以实现一边在 Hierarchy 中修改 GameObject,一边实时的同步到 LocalToWorld / Translation 中,并且不会出现两个物体的情况,仅由 Hybrid Renderer 负责渲染,尽管物体已经被转化为 Entity 并且 Destroy,但在 Hierarchy 中仍然可以选中物体并同步移动。

注意:在 Scene 窗口想要调试 Entity 场景需要勾选 SubScene 右侧的 Toggle

参考文章:Game Object Conversion and SubScene

【Unity】关于射击扩散的几种办法
2021-02-14 |0 条评论
建议阅读缩放比例:150%前言在多数射击游戏中,子弹的弹道通常不是固定的,而是在一个区域范围内变化的,有固定弹道变化,如 CS:GO,也有随机的弹道变化,本文主要讲解如何制作随机的弹道。制作随机...
加载中... 你已抵达世界之底
加载更多