CryENGINE3初探Entities (二)----使用C++创建自定义Entity(一)

本文是CryENGINE3 Entity系列的第二篇,探讨如何使用C++创建自定义Entity。作者指出,尽管书中关于这一部分的内容晦涩,但CryENGINE3中的GameObject用于提供Entity的高级功能。创建GameObject Extensions通常通过C++完成,官方提供了一些示例资源,这些示例展示了如何利用CGameObjectExtensionsHelper类简化创建过程。
摘要由CSDN通过智能技术生成

    经历了一个月的考试,终于又有机会抱着书啃啃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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值