经历了一个月的考试,终于又有机会抱着书啃啃CE3了,接着上回,我们继续来看CryENGINE3中的Entity。
首先我必须吐槽一点,可能是自己能力不足,书上这部分内容真是晦涩难解,很多要注意的地方都含糊不清,书中这一部分具体内容在本节后面列出。在开始之前,还有一个概念要大概说一下,CE3中除了entity,还有个和游戏物体有关的词,叫做GameObject,书中的解释是:当entity需要更多更高级的功能的时候,需要用到gameObject。而如果想要创建gameObject,需要创建gameObject extensions(扩展)。而这个gameobject extensions暂时还只能使用C++创建,Lua和C#都不可以。CryENGINE为了方便创建gameobject extensions,为我们创建了一个模板:CGameObjectExtensionsHelper类,这个类里面封装了很多重复的不必要我们逐个重写的内容。
然后,我们就开始动手创建gameobject extensions:
1.浏览官方的例子。
其实,在官方给我们提供的资源中,有一部分功能比较复杂的entity就是使用gameobject extensions创建的,具体位置见下图:
随便打开两个里面的.h文件,我们会发现一些问题,比如
再比如
相同点,他们都继承自同一个类模板:CGameObjectExtensionHelper,实现了里面所有纯虚函数,下面就是他们的基类,里面的每一个函数都有注释
2.好了,看完了提供给我们的资料,我们就可以自己动手写了。首先可以在GameFiles的Environment里面创建一个筛选器,把我们以后要写的都放进去,我这里起名 MyTestEntity,然后在里面添加一个类,我这边:类名:MyTestEntity2,它的父类填写: CGameObjectExtensionHelper < CProximityMine, IGameObjectExtension >。
3.完成后,我们需要转到IGameObjectExtensions类,找到里面的所有纯虚函数,实现他们。这里有一个简单的操作,直接把这些纯虚函数拷贝到.h和.cpp里面就行。或者直接拷贝我下面的代码:
//MyTestEntity2.h
#pragma once
#include "IGameObject.h"
class CMyTestEntity2 :
public CGameObjectExtensionHelper < CMyTestEntity2, IGameObjectExtension >
{
public:
CMyTestEntity2();
virtual ~CMyTestEntity2();
//IGameObjectExtension///
virtual void GetMemoryUsage(ICrySizer *pSizer) const;
virtual bool Init(IGameObject * pGameObject);
virtual void PostInit(IGameObject * pGameObject);
virtual void InitClient(int channelId);
virtual void PostInitClient(int channelId);
virtual bool ReloadExtension(IGameObject * pGameObject, const SEntitySpawnParams ¶ms);
virtual void PostReloadExtension(IGameObject * pGameObject, const SEntitySpawnParams ¶ms);
virtual bool GetEntityPoolSignature(TSerialize signature);
virtual void Release();
virtual void FullSerialize(TSerialize ser);
virtual bool NetSerialize(TSerialize ser, EEntityAspects aspect, uint8 profile, int pflags);
virtual void PostSerialize();
virtual void SerializeSpawnInfo(TSerialize ser);
virtual ISerializableInfoPtr GetSpawnInfo();
virtual void Update(SEntityUpdateContext& ctx, int updateSlot);
virtual void HandleEvent(const SGameObjectEvent& event);
virtual void ProcessEvent(SEntityEvent& event);
virtual void SetChannelId(uint16 id);
virtual void SetAuthority(bool auth);
virtual const void * GetRMIBase() const;
virtual void PostUpdate(float frameTime);
virtual void PostRemoteSpawn();
//IGameObjectExtension///
};
//MyTestEntity2.cpp
#include "stdafx.h"
#include "MyTestEntity2.h"
#include "IActorSystem.h"
CMyTestEntity2::CMyTestEntity2()
{
}
CMyTestEntity2::~CMyTestEntity2()
{
}
//IGameObjectExtension///
void CMyTestEntity2::GetMemoryUsage(ICrySizer *pSizer) const
{
}
bool CMyTestEntity2::Init(IGame