2018-04-20 14:43:54 qq_25409413 阅读数 187
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2380 人正在学习 去看看 杨石兴

一直想做一个属于自己的框架,想着怎么去在Unreal里面使用c#进行代码的编写,所以想着以c#跟c++之前进行通讯来做这个需求

c++工程

首先建立一个c++工程,然后编译成dll动态链接库给c#使用


#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <string.h>


using namespace std;


void OutPut()
{

}


extern "C" _declspec(dllexport) int Sum(int a, int b)
{
printf("Hello World \n");
return a + b;

}

然后编译生成之前将 项目设置-> 配置属性 -> 常规 -> 配置类型 修改为 动态链接库dll


点击编译生成,在项目生成的Debug里面有一个叫Debug有一个叫Test.dll的,复制到c#工程里面的Bin下面的生成exe旁边即可


c#工程

新建一个c#工程,输入一下代码,注意红色代码部分,里面EntryPoint是C++里面函数的名称,编译过后,运行就会发现在c++定义的函数Sum可以在c#里面进行是用了。

namespace UserCPlusPlusCode
{
    class Program
    {
        [DllImport("Test.dll",
            EntryPoint = "Sum",
            CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall)]


        public static extern int Sum(int a,int b);



        static void Main(string[] args)
        {
            Console.WriteLine(Sum(1,2));


            Console.ReadLine();
        }
    }
}



2018-06-08 17:36:00 tomicyo 阅读数 1921
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2380 人正在学习 去看看 杨石兴

背景

现代的游戏引擎都支持多平台,既然要支持多平台的话,自定义的构建系统在引擎工具链上就必不可少了。比如Unity需要同时支持C#,C++语言的编译,由此引入了Jamplus以及后来自己基于Jam和C#改造的UnityBuildSystem构建系统,Unreal则基于自己的需求(UHT生成)开发了UBTCryEngine则是基于CMake修改了一套构建系统。

游戏引擎涉及的编程语言也会比较多,一般会用**C++/C/ObjC/ObjC++**写核心代码,其他语言写工具链和框架。

Kaleido3D 是一个笔者业余时间写的跨平台的3D图形库,由于要同时支持Android、iOS平台,开发过程中不停的电脑切换容易打断工作,影响开发效率,所以突发奇想想到了在Windows上开发iOS程序,那也需要在Windows上构建iOS代码,因此开了个新坑:XBuild


现状

现有跨平台构建工具主要有:

  • CMake (市场份额最大)
  • Premake
  • GN (Chrome浏览器)
  • GYP (Chrome浏览器)
  • Meson(Linux上用的比较多)

如何在Windows上开发iOS程序?

iOS程序的构建主要基于Clang-LLVM体系,由于这套CFamily的工具链开源,因此网友开发了iOS Build Environment套件用于在Windows系统构建iOS应用(虽然违反了苹果的规定)。

说到开发,少不了一个好用的IDE用于代码编辑。这里考虑使用VSCode用于Windows下ObjC的代码编辑,VSCode支持微软开发的Language Server Protocol提供的代码提示补全高亮的协议,而相应的LLVM下也正在实现基于LSP的ClangD用于跨平台跨编辑器的代码编辑。


IrisBuild的需求

笔者曾有幸参与UE4的引擎优化开发,在开发过程中尝尽了漫长的编译时间等待以及资源打包带来的痛苦,为此如何提高引擎/游戏开发和迭代效率成为了XBuild的目标。

  • 支持分布式虚拟进程,类似Incredibuild
  • iOS、Android同主机平台构建
  • Visual Studio & Visual Studio Code & XCode 项目文件支持
  • 支持Rust、C++/C/ObjC/ObjC++、C#、Java、HLSL/DXIL、Metal、SPIRV编译

经过几个月的开发,IrisBuild套件有了雏形,其中借鉴了Google家的Ninja以及GN的特性,在此基础上简化了不少功能,形成了现在的语法。

构建前端 IrisBuild

cproj("kCore") {
    type = "shared_lib"
    srcs = [ 
        "Base/**.h",
        "Base/*.cpp",
        "XPlatform/**.h",
        "XPlatform/**.cpp"
    ]
    private = {
        defines = [ "LIB_BUILD=1", "BUILD_SHARED_LIB=1" ]
    }
    match(${target_os}) {
        "windows" => { 
            defines = ["K3DPLATFORM_OS_WIN=1","K3D_USE_SSE=1"] 
            srcs += "../Platform/Microsoft/Win32/**.cpp"
        }
        "android" => {
            defines = ["K3DPLATFORM_OS_ANDROID=1", "K3D_USE_NEON=1"] 
            srcs += "../Platform/Android/cpp/**.cpp"
        }
        "ios" => {
            defines = ["K3DPLATFORM_OS_IOS=1", "K3D_USE_NEON=1"] 
            srcs += "../Platform/Apple/iOS/**.mm"
            srcs += "../Platform/Apple/CpuUsage.mm"
        }
        "macos" | "linux" => {
            defines = ["K3DPLATFORM_OS_MAC=1", "K3D_USE_SSE=1"] 
            srcs += "../Platform/Apple/MacOS/**.cpp"
            srcs += "../Platform/Apple/CpuUsage.mm"
        }
        "linux" => {
            defines = ["K3DPLATFORM_OS_LINUX=1", "K3D_USE_SSE=1"] 
            srcs += "../Platform/Linux/**.cpp"
        }
    }
    srcs = list_files(srcs)
    inc_dirs = [ "." ]
    on_init = () {
        url = "https://ci.appveyor.com/api/projects/tomicyo/third-party-clibs/artifacts/build/third_party_clibs_windows_shared.zip"
        download_and_extract(url, "${build_dir}/third_party")
        glslang_url = "https://ci.appveyor.com/api/projects/tomicyo/glslang/artifacts/build/install/glslang-x64-Release.zip?job=Configuration%3A+Release"
        download_and_extract(glslang_url, "${build_dir}/third_party")
    }
}

这是简单的一个示例工程脚本,相比GN的语法描述更清晰和简洁,IrisBuild同样提供不少内置函数。

他相比于GN以及其他工具对跨平台开发的支持更方便和完善。
右键

生成VS工程目录
Solution

Android Native 代码开发
这里写图片描述

2019-09-18 15:07:04 nmjkl001 阅读数 928
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2380 人正在学习 去看看 杨石兴

官方

官方文档

虚幻学院(英文教程,未来可能有汉化)

https://academy.unrealengine.com/

官方B站

https://space.bilibili.com/138827797/#/

C++

  • 【侯捷】《C++系统工程师》课程
  • 【吕鑫】【VS2015】C/C++/数据结构教程(推荐有选择的看)http://class.qq.com/class/22124.html
  • 书籍推荐
    《C++ Primer Plus》或《Essential C++》或《C++ Primer》
    《大话数据结构》或《C++数据结构与算法(目前第4版)》
    《Effective C++》
    《More Effective C++》
    《Effective STL》或《STL源码剖析》
    《设计模式》、《游戏编程模式》
    《C++沉思录》
    《深度探索C++对象模型》

UE4教程

基础操作

蓝图编程基础

蓝图编程简介

蓝图的类型 注:此处的种类只说直接实现游戏逻辑的蓝图,动画蓝图等暂不谈

变量类型

UE4的组件

【官方文档】

【猎梦虚幻研究社】

事件节点

事件调度器(事件分配器)

【官方文档】事件调度器的使用

事件分配器

  • 【官方文档】 UE4的蓝图编程中,所有游戏逻辑的函数都需要通过事件来驱动,而自定义事件可以当做函数来驱动,同时也可以通过事件调度器进行驱动,通过事件调度器,可以让蓝图实现的游戏逻辑更加灵活

流程控制

蓝图的函数

枚举类型

蓝图的数组

【官方文档】

【大神博客】

蓝图的结构体

【官方文档】

【大神博客】 结构体的使用(包含部分关于枚举类型的操作)

【大神博客】结构体数组及多维数组

【猎梦虚幻研究社】

HitResult

蓝图的容器

Map

【官方文档】

Set

【官方文档】

蓝图宏

【官方文档】

【大神博客】

Timeline(时间轴)

随机流

数学表达式

蓝图的面向对象

构建脚本(蓝图相对于C++的构造函数)

面向对象特性

继承
多态
  • 重写父类函数:在MyBlueprint栏的Function组上方,有一个Override菜单,下拉并选择要重写的函数,派生类中重写的函数会覆盖基类的函数
  • 调用重写后的父类函数:右键重写后的函数节点,选择“Add call to parent function”选项
抽象
  • 如果了解面向对象思想中的抽象概念,自主按照需求定制蓝图类即可
封装
  • 蓝图类中的变量的细节面板中的“Instance Editable”如果打对号(或者MyBlueprint栏中让变量对应的眼睛睁开,即暴露蓝图变量),则当蓝图在关卡中被实例化后,可以通过实例的细节面板进行修改相应变量的值
  • 蓝图类中的变量和函数在细节面板中都有Private选项,如果Private打钩,则该变量或函数无法被蓝图类的派生类继承

蓝图通信 注:蓝图通信可以理解为不同蓝图间的信息传递和共享

【官方文档】 蓝图通信方法(没有提GetAllActorOfClass)

【大神博客】 https://www.cnblogs.com/songiveideas/p/learnmore2.html

1、直接蓝图

2、事件调度器

  • 参考上方“事件节点”

3、蓝图投射(CastTo节点)

4、蓝图接口

实现蓝图接口 http://api.unrealengine.com/CHN/Engine/Blueprints/UserGuide/Types/Interface/UsingInterfaces/index.html
使用蓝图接口 http://api.unrealengine.com/CHN/Engine/Blueprints/BP_HowTo/Interfaces/index.html
蓝图接口迁移 http://api.unrealengine.com/CHN/Engine/Blueprints/UserGuide/BlueprintComms/InterfaceMigration/index.html

5、GetAllActorOfClass

  • 这种方式并不能算是严格意义上的蓝图通信,其作用是通过该节点直接操作某一个类在关卡中所有的实例对象

视频教程

B站

人人素材

ABOUTCG在线课堂

SiKi学院

我的联系方式:

QQ:2161044579
邮箱:mogoostudio@outlook.com
Github:https://github.com/MogooStudio

2016-10-17 17:50:12 qq_20309931 阅读数 3367
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2380 人正在学习 去看看 杨石兴

Unreal Engine 4 C++ 动态加载UMG界面

最近研究了一下Unreal Engine4,本人不太习惯蓝图打开界面,就研究了下用C++来打开、显示界面。
好记性不如烂笔头啊,还是记录一下!

1.添加UMG依赖

在你的工程下找到以下文件 :

  • YourProject.Build.cs

添加如下代码:

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Slate", "SlateCore" });

添加后的完整文件:

  • YourProject.Build.cs
// Fill out your copyright notice in the Description page of Project Settings.

using UnrealBuildTool;

public class YourProject : ModuleRules
{
    public YourProject(TargetInfo Target)
    {
        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Slate", "SlateCore" });

        PrivateDependencyModuleNames.AddRange(new string[] {  });

        // Uncomment if you are using Slate UI
        // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

        // Uncomment if you are using online features
        // PrivateDependencyModuleNames.Add("OnlineSubsystem");

        // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
    }
}

在你的工程下找到以下文件 :

  • YourProject.h

添加如下代码:

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"

添加后的完整文件:

  • YourProject.Build.cs
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Engine.h"

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"

2.创建一个界面

创建一个蓝图控件,取名为Test,如图:

创建蓝图控件

拖拽几个测试控件,如图:

编辑器界面


3.添加代码

  • YourGameMode.h
#pragma once

#include "GameFramework/GameMode.h"
#include "Blueprint/UserWidget.h"
#include "YourGameMode.generated.h"

/**
 * 
 */
UCLASS()
class YOURGAMEMODE_API AYourGameMode : public AGameMode
{
    GENERATED_BODY()

public:
    // 开始游戏
    virtual void StartPlay() override;

private:

    /** 在游戏开始时我们将作为菜单使用的控件类。 */
    UPROPERTY(EditAnywhere)
    TSubclassOf<UUserWidget> StartingWidgetClass;

    /** 用作为界面的实例。 */
    UPROPERTY(EditAnywhere)
    UUserWidget* CurrentWidget; 
};
  • YourGameMode.cpp
// Fill out your copyright notice in the Description page of Project Settings.

#include "YourGameProject.h"
#include "YourGameModeGameMode.h"

// 开始游戏
void AYourGameMode::StartPlay()
{
    Super::StartPlay();

    /** 游戏开始后弹出界面 */
    StartingWidgetClass = LoadClass<UUserWidget>(NULL, TEXT("Blueprint'/Game/UI/Test.Test_C'"));
    if (StartingWidgetClass != nullptr) 
    {
        CurrentWidget = CreateWidget<UUserWidget>(GetWorld(), StartingWidgetClass);
        if (CurrentWidget != nullptr)
        {
            CurrentWidget->AddToViewport();
        }
    }
}

注意:这里有个大坑,动态加载UClass时需要在代码结尾增加“_C”

StartingWidgetClass = LoadClass<UUserWidget>(NULL, TEXT("Blueprint'/Game/UI/Test.Test_C'"));

4.编译测试

编译后可直接运行,如果成功显示出界面:

这里写图片描述

成功加载界面。

2018-08-12 00:46:24 weixin_34194551 阅读数 42
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2380 人正在学习 去看看 杨石兴

因为篇幅很短,所以尝试全文字写法。几分钟看完的文字也没必要用十几分钟写完是吧。

Attribute(特性标签)是C#中非常有用的一个特性,有用到什么程度呢?以至于C++的很多开发者,都通过自己的预处理器和标签来增加这个功能(典型的如Qt和Unreal)

1.
在各种开发中,我们经常需要使用枚举来代表一组特性,同时又需要一些文字描述,这些描述可能是路径,或者是字符串,两者是一一对应的。

比如,我定义了一组材质,每个对应不同的文件加载路径。或者我定义了一组数据类型,每个对应不同的字符串简写。

我们自己写的数据导出工具中,就有这种写法。我在枚举中设定了很多导出类型,如IntArray,FloatArray等,但是我想要在对应的地方,把这些类型输出为字符串的简写,如IntArray输出为"Int[]",FloatArray输出为"Float[]"。要完成这一点,两者需要一个简单的对应关系。

如何做呢,可以做成Dictionary,也可以写class,或者做成外部Config,方法很多,但是这些写法都有一个问题,就是太罗嗦,内聚性不够。

2.
C#中,我们可以使用Description标签,把需要绑定的字符串内容填写进去,然后写一个函数,在需要的时候,把枚举的这个Description抓出来就行了。

之前的写法,你需要至少一组枚举值和一个查找表,如果你用class或外部config,你要写更多东西。

这种写法下,你只需要一组带Description标签的枚举就行了。那个抓取函数是提前写好的,可以重复使用。代码非常清晰简洁,内聚很高。至于效率什么的我不担心,毕竟我的应用领域,C#这种写法一般都是小型的初始化,花上一点代价,让代码更清晰是值得的。

Unreal配C++岂不美哉

阅读数 443

C++实现反射

阅读数 7

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