2018-11-15 17:21:01 xiaoxiaolooi 阅读数 198

unreal GIS 模块

unreal4 源代码模块

自从unreal4 开源以来,osg ogre 渐渐不能用来吃饭,于是本着听人劝吃饱饭的思想,转头unreal门下,继续为混口饭事业,投身革命。可是unreal的c++编程基本没有什么例子可看,只好自己从头做起。

  1. 开发者驱动
  2. 编辑器
  3. 工程目录
  4. 基础框架代码
  5. 第三方库

在这里插入图片描述
这个是文档目录,代码量难以阅读,决定从以下三方向入手,第一次写文字,真心不容易。
1.案例编写使用unreal4 的普通界面搭建自定义三维场景 介绍 editor层的基础代码
2.添加GIS地图属性信息 介绍 驱动层的基础代码
3.程序化植物合成 介绍 与unreal基础平台结合
以后会陆续跟新到这里
推荐大家使用 阿里云 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=ic4sfgeu

2017-11-14 10:05:40 WAN_EXE 阅读数 307

抽空在学Unreal引擎,以便更好地掌握图形图像的基础。

这些文章主要来自于Unreal的官网,以实际的例子为主,不会说明太详细的步骤,主要讲解代码。

有兴趣的可以参考官网

https://www.unrealengine.com/en-US/blog

已经完成的知识有

Unreal引擎源码下载,编译,使用VStudio进行代码编辑。

Development Setup

Programming Quick Start


2018-11-26 19:29:43 zp288105109a 阅读数 196

       好记性不如烂笔头,而且Unreal4用的相对来说也比较少,工作用Unity,学习时间大部分用在DirectX上,也就偶尔看看Unreal。Unreal的API肯定记不住,现在写下来,省的下次再去Google看一堆文章,方便自己。
       看着蓝图教程,用C++来实现,发现自己还是满蛋疼的。教程中是拖入一个新的Mesh来区分AI和Player,懒得拖,就用Player的Mesh,修改下显示颜色来做区分,简单粗暴。
       先来看下原来的材质球:


       拖一个VectorParameter,取名为Color,再跟之前的TextureSample相乘就好,这个BaseColor应该是Diffuse(漫反射吧,我猜的,看到了Specular和Normal)


       接着就是代码上的修改了:

void AAICharacter::Initialize()
{
	// Set Skeletal Mesh
	auto skeletalMesh = GetMesh();
	static ConstructorHelpers::FObjectFinder<USkeletalMesh> aiMesh(
		TEXT("SkeletalMesh'/Game/Model/Character/Eve_by_J__Gonzales.Eve_by_J__Gonzales'"));
	if (aiMesh.Object != nullptr)
	{
		skeletalMesh->SetSkeletalMesh(aiMesh.Object);
		auto meshLocation = FVector(0.0f, 0.0f, -88.0f);
		auto meshRotation = FRotator(0.0f, -90.0f, 0.0f);
		auto meshScale = FVector(1.0f, 1.0f, 1.0f);
		auto meshTransform = FTransform(meshRotation, meshLocation, meshScale);
		skeletalMesh->SetRelativeTransform(meshTransform);
	}

	// Create Dynamic Material
	auto dynamicMaterial = skeletalMesh->CreateDynamicMaterialInstance(0);
	dynamicMaterial->SetVectorParameterValue(TEXT("Color"), FLinearColor(1.0f, 0.0f, 0.0f, 1.0f));
}

       上面一段就是AI设置Mesh的代码,跟Player的代码一样。有注释。接下来的2行代码就是修改材质球中参数名为Color的VectorParameter,为了区分,将AI的改成红色。
       效果如下:

2018-11-26 19:36:46 zp288105109a 阅读数 194

       自己玩的时候,发现UMG的初始化比PlayerState初始化快。而且UI一直执行NativeTick来刷新UI界面,有点费。研究了一下Unreal的Delegate,发现有点麻烦,还得自己声明一个类型。
       问题代码:

AMainGameMode::AMainGameMode()
{
	DefaultPawnClass = AMainCharacter::StaticClass();
	PlayerStateClass = AMainCharacterState::StaticClass();
	PlayerControllerClass = AMainCharacterController::StaticClass();
}

void AMainGameMode::BeginPlay()
{
	auto tempGameInstance = Cast<UMainGameInstance>(GetGameInstance());
	if (tempGameInstance != nullptr)
		tempGameInstance->ShowWidget((int)EUserWidgetID::MainView);
}

       修改后,Delegate其实可以放在一个单例中来管理,没搜到Unreal单例的实现,就随便拿GameInstance来测试:

       MainGameInstance.h

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnInitPlayerState);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnUpdatePlayerState);

public:
	void BoardCast_InitPlayerState();
	void BoardCast_UpdatePlayerState();

public:
	UPROPERTY(BlueprintAssignable, Category = "MainGameInstance")
		FOnInitPlayerState m_OnInitPlayerState;
	UPROPERTY(BlueprintAssignable, Category = "MainGameInstance")
		FOnUpdatePlayerState m_OnUpdatePlayerState;

       MainGameInstance.cpp

void UMainGameInstance::BoardCast_InitPlayerState()
{
	m_OnInitPlayerState.Broadcast();
}

void UMainGameInstance::BoardCast_UpdatePlayerState()
{
	m_OnUpdatePlayerState.Broadcast();
}

       监听就很简单了,就跟普通的OnComponentBeginOverlap事件差不多。在UMG的C++类中声明2个方法:

private:
	UFUNCTION()
		void OnInitPlayerState();
	UFUNCTION()
		void OnUpdatePlayerState();

       添加和移除也很简单:

void UMainUserWidget::AddEvent()
{
	auto mainGameInstance = Cast<UMainGameInstance>(GetGameInstance());
	if (!mainGameInstance) return;

	mainGameInstance->m_OnInitPlayerState.AddDynamic(this, &UMainUserWidget::OnInitPlayerState);
	mainGameInstance->m_OnUpdatePlayerState.AddDynamic(this, &UMainUserWidget::OnUpdatePlayerState);
}

void UMainUserWidget::RemoveEvent()
{
	auto mainGameInstance = Cast<UMainGameInstance>(GetGameInstance());
	if (!mainGameInstance) return;

	mainGameInstance->m_OnInitPlayerState.RemoveAll(this);
	mainGameInstance->m_OnUpdatePlayerState.RemoveAll(this);
}

Multi-cast Delegates官网地址

2015-07-15 19:52:06 u013927810 阅读数 810

用Unreal开发一个简单的MC Demo 第一节

1.使用一个模版

Unreal提供了一系列的基础模版供大家使用,因为我们要做一个MC Demo,最适合的Demo即是First Person Example。
该模板提供了第一人称射击的基础,可以控制角色上下左右蹦跳,还能瞄准发射子弹,十分像MC的操作。

创建项目

2.制作一个MC风格的方块

首先将这上中下三个面的图片导入到Unity

然后右键–创建材质,只有这样才能给Unity使用

创建一个BSP方块

选择方块,将他的画刷大小改成100/100/100

将模式改为选择并旋转对象,然后将刚创建的材质拖到方块的6个面上,如果看不到记得旋转一下
于是我们得到了一个6面涂色的方块。

在世界大纲里面找到刚才创建的方块,点击他,然后创建静态网格物体

双击进入刚才的静态网格物体,设置他的碰撞,否则方块不能堆叠或者站在上面

于是,一个MC风格的静态网格物体创建完成~

在最后,我们选择该物体,然后蓝图->转换为蓝图类,将物品转化为蓝图物品。方便以后增加新功能

3.蓝图编辑

First Person Example的主要功能存放在FirstPersonCharacter蓝图里面,有移动,开火等功能。

首先我们当然要增加放置方块功能了。

首先增加Place事件,用鼠标左键触发,原来的开火放到鼠标右键
去编辑-项目设置里面修改一下~

好,开始进入正式的蓝图编辑。

首先创建一个事件监听,监听输入的Place事件
收到Place事件后,发出一条射线,通过Break Hit Result判断命中的单位

然后将命中的点XYZ除以100再乘以100(对齐方格),然后创建一个方块,然后就Bingo!

可以运行一下程序看看结果

果然可以放方块了!但是有个问题,为什么方块都在底下,堆不上去呢?

其实很简单,我们碰撞的点在地底,Z通过int(Z/100)*100运算的结果的也一直在地底下,所以我们永远堆不上去。而且在MC里,我们在方块的左右点击放置,理应也出现在目标箱子的左右。
所以我们还要获取碰撞的方块,判断命中点在目标方块的上下左右,然后放置箱子。

首先获得碰撞的Actor,尝试将他转换成方块,取得他的XYZ,用来跟之前的XYZ对比

判断Y轴,放置在箱子的上或者下,将结果保存到Cube Place Vector(需要创建一个Vector变量)里

X轴和Z轴同理。。。

最后在目的地创建方块

运行一下

非常好!BTW,我们的测试小人还能蹦到方块上。完美!

好了,第一节就这样完工。下一节我们尝试移除方块~

unreal

阅读数 231

没有更多推荐了,返回首页