11715人加入学习
(26人评价)
【旧版】Unreal基本知识案例 - 密室逃脱

旧版课程,制作完成于2017-01-11

价格 免费

// Fill out your copyright notice in the Description page of Project Settings. #include "OpenDoor.h" #include "GameFramework/Actor.h" // Sets default values for this component's properties UOpenDoor::UOpenDoor() { // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features // off to improve performance if you don't need them. PrimaryComponentTick.bCanEverTick = true; // ... } // Called when the game starts void UOpenDoor::BeginPlay() { Super::BeginPlay(); // ... //得到所在Actor 设置这个Actor的属性 AActor* Actor = GetOwner(); // pick =y yaw = z roll= x FRotator NewRotator = FRotator(90, 0, 0); Actor->SetActorRotation(NewRotator); } // Called every frame void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); // ... }

[展开全文]

使用AActor* 需要引用的库:#include "GameFramework/Actor.h"

 

OpenDoor.cpp

void UOpenDoor::BeginPlay()

{

    Super::BeginPlay();

    // 得到所在的Actor  设置这个Actor的属性

    AActor* Actor = GetOwner();

    // pitch=y  yaw=z  roll=x

    FRotator NewRotator = FRotator(0,90.0);

    Actor->SetActorRotation(NewRotator);

}

世界大纲视图 里面的类型继承自Actor

世界大纲视图,文件多,可以创建文件夹统一管理

点击世界大纲视图里面的小眼睛,可以隐藏选中的,可以用来确保没有遗漏物体

 

命名习惯

AActor

UOpenDoor

bCanEverTick

 

Actor 是个指针,同时这还是个对象,要调用它的方法,需要使用 ->

并不是指针拥有的函数,而是对象的函数

 

在Visual Studio 保存了代码,需要在UE4编辑器的工具栏点击 【编译】

 

可以移动的物体才能旋转,需要在细节面板,变换--移动性,设置为可移动

 

显示有用的调试信息:

窗口---开发者工具---输入日志

Windows---Developer Tools---Output Log

 

每次修改完代码,记得点【编译】!!!

 

[展开全文]

添加组件---新建C++组件...

Add Component---New C++ Component

 

Inherited 继承

 

选择父类---Actor Component

 

新建C++组件:

Actor Component

Scene Component

Static Mesh Component

Skeletal Mesh Component

Camera Component

Directional Light Component

 

 

内容浏览器---C++类

 

Visual Studio解决方案管理器

Engine 提供需要的类

Game 我们后续的代码

 Game--引用,添加引用,UE4,代码引用类,报错,试一试引用UE4

红色大写的词,都是 宏(#define)

pubic 公开的

protected 保护的

UOpenDoor::UOpenDoor() 构造方法

BeginPlay() 当游戏运行的时候调用的

TickComponent()  每一帧都会调用的

 

OpenDoor.cpp 中对BeginPlay() 和 TickComponent() 进行了重写

 

先调用构造函数,再调用Begin

TickComponent 每帧调用

 

UnrealEngineProjectGameModeBase  跟游戏发布的一些设置有关的

 

 

[展开全文]

拖动位置,都产生间隔,试一试改小snap,对齐

 

给门/物体添加碰撞器,找到门/物体,双击进入该窗口:

添加盒型碰撞器:

Add Box Simplified Collision

 

绿线就是碰撞器

 

Simple Collision 前面的勾是控制是否显示碰撞器:

Complex Collison (复杂碰撞器,根据模型的网格来生成碰撞器,复杂碰撞器消耗性能)

 

R工具,调整碰撞器的大小,一会儿过大,一会儿过小,调整snap

修改完后记得保存save

有了碰撞器,才不会穿过物体

[展开全文]

Alt+P 播放场景

ESC 退出播放场景

Shift + F1 使得鼠标指针脱离场景,可以点击其他地方:比如世界大纲视图;重新点击视口,进入场景,隐藏鼠标指针

 

材质(Materials)

双击某个材质进入的窗口:

(编辑材质的一些属性)

给模型上材质,拖动到物体上

 

Shader和材质共同起作用的

 

材质就是用来控制显示的外观的

 

Materials 下的 放大镜 图标是定位材质:

[展开全文]

删除物体:选中物体,按Delete键

 

重置为默认 / reset to default

xy轴,平面移动,红绿中间的直接,点击拖动

 

按住Shift,点击移动的箭头/或者两轴间的直角∟,镜头跟随物体一起移动

 

按住Alt,点击移动的箭头 拖动,复制出一个新物体

 

切换到缩放工具看,再调节缩放的大小

 

墙间有一些缝,使用  构建---仅构建光照

[展开全文]

策划/美术:蓝图

开发 深入学习:蓝图和C++

工具没有好坏,实现功能重要NB

 

项目设置:跟当前项目有关的设置,比如:默认启动的场景

编辑器偏好设置:跟整个编辑器有关的,比如:语言

 

修改编辑器的语言:编辑器偏好设置---普通---区域和语言

[展开全文]

snap:每次变换的间隔

 

Show FPS

 

透视图、Top,Left、Front

 

带光照(Lit)

 

线框(Wireframe)

线框模式:

按下鼠标右键,拖动,移动视野

滚动鼠标滚轮,放大缩小视野

按F键也是聚焦物体

 

不带光照(看不出来立体的效果)

 

相机移动速度改变:

1、视口右上角

2、按下鼠标右键,滚动滑轮,前滚增加速度,后滚减少速度

图标上的基础速度

滚动滑轮是细微变化的速度

 

最大化或恢复该窗口

 

落地键:End 键

起作用:需要选中物体下方有物品/平面(落到距离选中物体的最近的平面,ps:与物品网格有关)

 

按某个平面移动,选中物体,箭头的直角∟地方拖动

[展开全文]

关卡等同于场景 等同于视图

 

[展开全文]

FVector Start;
    FRotator ViewRotator;
    GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(Start, ViewRotator);

    FVector End = Start + ViewRotator.Vector()*100;

    DrawDebugLine(GetWorld(), Start, End, FColor(255, 0, 0), false, 0, 0, 10);

[展开全文]

当Simulate Physics勾选完后,物体受模拟物理效果影响,如重力。

Simulation Generates Hit Events 是"当此对象在物理模拟中发生碰撞时是否发送命中事件"

[展开全文]

4.21版本中使用 DefaultPawn = GetWorld()->GetFirstLocalPlayerFromController()->GetPawn;会报错"不允许指针指向不完整的类类型"

改用如下方法getpawn

在private中添加

APlayerController * playerController;

AActor * defaultPawn;

在BeginPlay()中添加

playerController = UGameplayStatics::GetPlayerController(GWorld, 0);
defaultPawn = PlayerController->GetPawn();

添加头文件

#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"

[展开全文]

 DefaultPawn = GetWorld()->GetFirstPlayerController()->GetPawn();

这里居然报错,害我找了半天,原来只要编译成功了就行

[展开全文]

解决奔溃问题

UOpenDoor::UOpenDoor()
{
	// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
	// off to improve performance if you don't need them.
	PrimaryComponentTick.bCanEverTick = true;

	Owner = GetOwner();
	DefaultPawn = GetWorld()->GetFirstPlayerController()->GetPawn();

}

 

初始化不能放在构造函数中,要放在BeginPlay()中。

[展开全文]

授课教师

SiKi学院老师

课程特色

图文(2)
视频(37)