2019-04-01 19:54:58 m0_37605956 阅读数 270
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

需要导入模型(如fbx类型)到工程中时,步骤参考:

  1. 将fbx文件copy至工程的目录文件中,
  2. 内容浏览器中导入该fbx文件,会生成.uasset文件,导入过程应该还会生成一个material文件
  3. 导入该模型对应的texture文件,包括color纹理和normal纹理,
  4. 打开material,在event graph里设置texture,color纹理对应基础颜色,normal纹理对应法线
  5. 把fbx文件的material设置为上面4中的material
  6. 新建一蓝图,添加对应的mesh,如robotkyle中对应的是skeletalmesh,然后再mesh中选择对应的骨架网格体,蓝图创建完毕

技巧:
7. 运行游戏后,按住alt键,移动鼠标可以模拟手柄。
8. 射线瞄准人物后为什么接收不到事件,看看是不是模型的collision没有选择"BlockAll"
9.

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

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

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

Unreal Engine4 C++ 动态加载Level(关卡)

今天研究了下如何使用代码来加载编辑好的关卡,现在已知的是以下两种方式:


  • 使用OpenLevel方法
UGameplayStatics::OpenLevel(GWorld, "YourLevel", false, "");

OpenLevel会调用SetClientTravel,会断开所有连接的客户端并像客户端一样行动,会丢弃所有的状态信息。


  • 使用ServerTravel方法
GetWorld()->ServerTravel(FString("/Game/Maps/YourLevel"));

使用ServerTravel时,将保留所有PlayerController,PlayerState,GameMode和GameState实例。
ServerTravel将首先将每个人加载到一个“转换关卡”,默认是空的,然后它将所有人都加载到目标关卡。


本文主要介绍的方法为OpenLevel


1.添加依赖

2017-02-12 18:15:52 shangguanwaner 阅读数 6674
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

Unreal Engine 4 动态切割模型实现

《合金装备:复仇》里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割。
UE4中的ProceduralMeshComponent这个组件可以很容易的就实现这种功能,下面介绍下实现的方法。

准备模型

首先我们准备一个模型。
准备一个模型

我做了一个简单的圆柱体,用来测试。注意需要切割的地方,为了保证细节,多放点顶点。
为了能够动态切割,我们要勾选这个模型的Allow CPUAccess选项。
勾选AllowCPU Access

新建蓝图

新建一个Actor蓝图,为它添加两个组件,一个是StaticMeshComponent,一个是ProceduralMeshComponent,在Construct Script中,将StaticMesh的模型数据拷贝到ProceduralMesh中去。
拷贝模型数据

调整ProceduralMesh参数

出于优化的目的,ProceduralMeshComponent默认勾选了UseComplexAs SimpleCollision这个属性,为了实现我们切割下来的能正常的进行物理模拟,需要把这个属性给取消勾选。
这里写图片描述

实现切割

这里写图片描述
SliceProceduralMesh实现模型的切割。说下几个参数:
* PlanePosition是切割平面的位置
* PlaneNormal 是切割平面的法线,也就是朝向
* Create Other Half 切割下来的部分,是否创建新的ProceduralMesh
* Cap Option No Cap,切面不缝合,Create New Section For Cap; 缝合,使用自定义的材质来贴补缝合的面; Use Last Section for Cap,使用模型的材质来贴补缝合的面。
具体效果如下:
这里写图片描述

2019-04-12 18:25:44 ywjun0919 阅读数 130
  • 从这里开始虚幻4-Editor介绍 v4.18

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

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

异步加载类:AsyncLoading.cpp。AsyncLoadingThread.h,使用FAsyncLoadingThread异步处理

int32 LoadPackageAsync(const FString& InName, const FGuid* InGuid /*= nullptr*/, const TCHAR* InPackageToLoadFrom /*= nullptr*/, FLoadPackageAsyncDelegate InCompletionDelegate /*= FLoadPackageAsyncDelegate()*/, EPackageFlags InPackageFlags /*= PKG_None*/, int32 InPIEInstanceID /*= INDEX_NONE*/, int32 InPackagePriority /*= 0*/)
{
	static bool bOnce = false;
	if (!bOnce && GEventDrivenLoaderEnabled)
	{
		bOnce = true;
		FGCObject::StaticInit(); // otherwise this thing is created during async loading, but not associated with a package
	}

	// The comments clearly state that it should be a package name but we also handle it being a filename as this function is not perf critical
	// and LoadPackage handles having a filename being passed in as well.
	FString PackageName;
	if (FPackageName::IsValidLongPackageName(InName, /*bIncludeReadOnlyRoots*/true))
	{
		PackageName = InName;
	}
	// PackageName got populated by the conditional function
	else if (!(FPackageName::IsPackageFilename(InName) && FPackageName::TryConvertFilenameToLongPackageName(InName, PackageName)))
	{
		// PackageName will get populated by the conditional function
		FString ClassName;
		if (!FPackageName::ParseExportTextPath(PackageName, &ClassName, &PackageName))
		{
			UE_LOG(LogStreaming, Fatal, TEXT("LoadPackageAsync failed to begin to load a package because the supplied package name was neither a valid long package name nor a filename of a map within a content folder: '%s'"), *PackageName);
		}
	}

	FString PackageNameToLoad(InPackageToLoadFrom);
	if (PackageNameToLoad.IsEmpty())
	{
		PackageNameToLoad = PackageName;
	}
	// Make sure long package name is passed to FAsyncPackage so that it doesn't attempt to 
	// create a package with short name.
	if (FPackageName::IsShortPackageName(PackageNameToLoad))
	{
		UE_LOG(LogStreaming, Fatal, TEXT("Async loading code requires long package names (%s)."), *PackageNameToLoad);
	}

	if ( FCoreDelegates::OnAsyncLoadPackage.IsBound() )
	{
		FCoreDelegates::OnAsyncLoadPackage.Broadcast(InName);
	}

	// Generate new request ID and add it immediately to the global request list (it needs to be there before we exit
	// this function, otherwise it would be added when the packages are being processed on the async thread).
	const int32 RequestID = GPackageRequestID.Increment();
	FAsyncLoadingThread::Get().AddPendingRequest(RequestID);

	// Allocate delegate on Game Thread, it is not safe to copy delegates by value on other threads
	TUniquePtr<FLoadPackageAsyncDelegate> CompletionDelegatePtr;
	if (InCompletionDelegate.IsBound())
	{
		CompletionDelegatePtr.Reset(new FLoadPackageAsyncDelegate(InCompletionDelegate));
	}

	// Add new package request
	FAsyncPackageDesc PackageDesc(RequestID, *PackageName, *PackageNameToLoad, InGuid ? *InGuid : FGuid(), MoveTemp(CompletionDelegatePtr), InPackageFlags, InPIEInstanceID, InPackagePriority);
	FAsyncLoadingThread::Get().QueuePackage(PackageDesc);

	return RequestID;
}

所有异步加载最后应该都在这里。

 

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

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

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

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.编译测试

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

这里写图片描述

成功加载界面。

Unreal里的动画

阅读数 1622

unreal4 源码引言

阅读数 250

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