Unreal Engine 游戏开发学习笔记 20181029


本篇博文实为在”系统”学习 Unreal Engine 4 游戏开发后整理的学习笔记。笔记按照每天的学习内容进行整理记录备忘。

本文为 Week2 Class1! 其中 表示上午的学习内容, 表示下午的学习内容。从本周开始连续三周学习 C++ 基础。同时强烈推荐像我一样的初学者看下”菜鸟教程”的 C++ 部分,本周的笔记绝大部分整理的内容均来自菜鸟笔记,只是内容按照上课老师所讲并在笔记中穿插了一些老师上课所讲实例,感谢菜鸟笔记网站管理员的无私分享。

今日内容摘要(知识点梳理):
1. 安装 Visual Studio 2017 并了解常用功能和了解 C++ 工程的创建及目录结构
2. C++ 基础


周末作业

我的周末需要做的是加上游戏声音会更加有感觉!

在作业时候想问的问题:

  1. 如何实现actor UI 一直面对的是摄像机 (已解决)
  2. 如何制作actor的来回走动的动画
  3. 如何在玩家碰到打死的盒子以后显示的是打死的哪一个人的盒子 (已解决)

Visual Studio 2017

Visual Studio 2017 的安装与破解

安装

破解

常用配置

  • 主题
  • 自动补全
  • 缩进
  • 其他自定义设置

Visual Studio 2017 基本介绍与目录结构

项目创建

  • 打开VS2017后,点击入下图设置
  • 新建项目
  • 选择C++为我们的编程语言
  • 选择 Win32 控制台应用程序
  • 设置 名称 此为工程名称
  • 位置:选定解决方案存储位置
  • 解决方案名称(自动与工程名称同名)

 Visual Studio 第一个项目创建

  • 点击下一步提示信息后进入如下图,并做如下图勾选设置,即可创建第一个工程。

 Visual Studio 第一个项目创建

目录结构

 第一个项目创建默认状态
默认创建的工程目录为如上图的结构:

  • 右侧为代码编辑区域 左侧为工程树
  • 注意此前创建工程的时候默认会放在以工程名创建而出的解决方案下(同一个解决方案可以创建多个工程)

头文件文件夹

主要存放的是头文件的代码,一般以.h文件类型结尾.

头文件(Header file):用于存放对类型定义、函数声明、全局变量声明等实体的声明,作为对外的接口.
写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。
在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

1
2
3
4
5
6
#ifndef CIRCLE_H
#define CIRCLE_H

//你的代码写在这里

#endif

这样做是为了防止重复编译,不这样做就有可能出错。至于CIRCLE_H 这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。

源文件文件夹

主要存放的是源文件的代码,一般以.cpp文件类型结尾.比如我们默认创建的工程后就会自动存储一个名为Day01.cpp的源文件。

源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。

源文件编写常用函数及数据类型

include

在项目创建初期,已经为我们加载进来一些头文件信息存放于外部依赖项中,同时我们可以直接调用C++的标准库。
以下代码将打印Hello world到控制台(cmd命令行窗口)中:

1
2
3
4
5
6
7
8
9
// Day01.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <iostream>
int main()
{
std::cout << "hello World !" << std::endl;
return 0;
}

当我们使用cout输出hello world到控制台时候,使用到cout函数,此函数存放于iostream.h(外部依赖项文件夹中)通过include将函数加载进来即可正常调用,否则函数调用失败。

namespace 命名空间

同时注意到cout函数前面有 “std::” 字样,此字样确定函数的”命名空间”。

命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突。命名空间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。

我们也可以在Main函数之前就加入命名空间的指定使用 using namespace std; 此时的代码可以改写为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Day01.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <iostream>

using namespace std;

/*
使用引入命名空间后,不需要再写std::
std::cout << "Hello World!!" << std::endl; //未引入命名空间
cout << "Hello World!!" << endl; // 引入命名空间
当自己有一些文件需要引用时候,可以创建自己的命名空间,以防止和标准库混淆
*/

int main()
{
cout << "hello World !" << endl; //此时我们就无需再函数前面加上函数的命名空间了
return 0;
}

https://www.cnblogs.com/shikamaru/p/5826117.html

注释

程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。

C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。

单行注释: // 符号后面的这一行所有字符都将被解释器忽略。

多行注释(多行注释):

1
2
3
/* 
/* \*/内的所有字符都将被解释器忽略。
\*/

数据类型与变量

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。

您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。

基本的内置类型

  • float 单精度浮点型 占4个字节 取值范围3.4E+10的负38次方 - 3.4E+10的38次方之间
  • double 双精度浮点型 占8个字节 取值范围1.7E+10的负308次方 - 1.7E+10的正308次方之间
  • integer 整型 占4个字节 取值范围在-2,147,483,648 - 2,147,483,647之间
  • long 整型 占8个字节 取值范围在9,223,372,036,854,775,808 - 9,223,372,036,854,775,807之间
  • string 字符串
  • char 字符类型
  • bool 布尔

一些基本类型可以使用一个或多个类型修饰符进行修饰:

  • signed
  • unsigned
  • short
  • long

书写基本语法:

以下为变量的基本了解:
// 表明后面容器的类型 容器(占用物理内存) 放的动作 放什么放多少 ;
float AverageHeight = 175 此句结束

变量:可以改变的量叫变量
变量类型 变量名 变量值
float TotalMoney = 64.5f

详细说明: https://blog.csdn.net/VNanyesheshou/article/details/50494982?utm_source=blogxgwz4

各种数据类型的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>  
#include<string>
#include <limits>
using namespace std;

int main()
{
cout << "type: \t\t" << "************size**************"<< endl;
cout << "bool: \t\t" << "所占字节数:" << sizeof(bool);
cout << "\t最大值:" << (numeric_limits<bool>::max)();
cout << "\t\t最小值:" << (numeric_limits<bool>::min)() << endl;
cout << "char: \t\t" << "所占字节数:" << sizeof(char);
cout << "\t最大值:" << (numeric_limits<char>::max)();
cout << "\t\t最小值:" << (numeric_limits<char>::min)() << endl;
cout << "signed char: \t" << "所占字节数:" << sizeof(signed char);
cout << "\t最大值:" << (numeric_limits<signed char>::max)();
cout << "\t\t最小值:" << (numeric_limits<signed char>::min)() << endl;
cout << "unsigned char: \t" << "所占字节数:" << sizeof(unsigned char);
cout << "\t最大值:" << (numeric_limits<unsigned char>::max)();
cout << "\t\t最小值:" << (numeric_limits<unsigned char>::min)() << endl;
cout << "wchar_t: \t" << "所占字节数:" << sizeof(wchar_t);
cout << "\t最大值:" << (numeric_limits<wchar_t>::max)();
cout << "\t\t最小值:" << (numeric_limits<wchar_t>::min)() << endl;
cout << "short: \t\t" << "所占字节数:" << sizeof(short);
cout << "\t最大值:" << (numeric_limits<short>::max)();
cout << "\t\t最小值:" << (numeric_limits<short>::min)() << endl;
cout << "int: \t\t" << "所占字节数:" << sizeof(int);
cout << "\t最大值:" << (numeric_limits<int>::max)();
cout << "\t最小值:" << (numeric_limits<int>::min)() << endl;
cout << "unsigned: \t" << "所占字节数:" << sizeof(unsigned);
cout << "\t最大值:" << (numeric_limits<unsigned>::max)();
cout << "\t最小值:" << (numeric_limits<unsigned>::min)() << endl;
cout << "long: \t\t" << "所占字节数:" << sizeof(long);
cout << "\t最大值:" << (numeric_limits<long>::max)();
cout << "\t最小值:" << (numeric_limits<long>::min)() << endl;
cout << "unsigned long: \t" << "所占字节数:" << sizeof(unsigned long);
cout << "\t最大值:" << (numeric_limits<unsigned long>::max)();
cout << "\t最小值:" << (numeric_limits<unsigned long>::min)() << endl;
cout << "double: \t" << "所占字节数:" << sizeof(double);
cout << "\t最大值:" << (numeric_limits<double>::max)();
cout << "\t最小值:" << (numeric_limits<double>::min)() << endl;
cout << "long double: \t" << "所占字节数:" << sizeof(long double);
cout << "\t最大值:" << (numeric_limits<long double>::max)();
cout << "\t最小值:" << (numeric_limits<long double>::min)() << endl;
cout << "float: \t\t" << "所占字节数:" << sizeof(float);
cout << "\t最大值:" << (numeric_limits<float>::max)();
cout << "\t最小值:" << (numeric_limits<float>::min)() << endl;
cout << "size_t: \t" << "所占字节数:" << sizeof(size_t);
cout << "\t最大值:" << (numeric_limits<size_t>::max)();
cout << "\t最小值:" << (numeric_limits<size_t>::min)() << endl;
cout << "string: \t" << "所占字节数:" << sizeof(string) << endl;
// << "\t最大值:" << (numeric_limits<string>::max)() << "\t最小值:" << (numeric_limits<string>::min)() << endl;
cout << "type: \t\t" << "************size**************"<< endl;
return 0;
}

本实例使用了 endl,这将在每一行后插入一个换行符,<< 运算符用于向屏幕传多个值。我们也使用 sizeof() 函数来获取各种数据类型的大小。

当上面的代码被编译和执行时,它会产生以下的结果,结果会根据所使用的计算机而有所不同:

数据类型 所占字节数 最大值 最小值
bool 1 1 0
char 1 1 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type:         ************size**************
bool: 所占字节数:1 最大值:1 最小值:0
char: 所占字节数:1 最大值: 最小值:?
signed char: 所占字节数:1 最大值: 最小值:?
unsigned char: 所占字节数:1 最大值:? 最小值:
wchar_t: 所占字节数:4 最大值:2147483647 最小值:-2147483648
short: 所占字节数:2 最大值:32767 最小值:-32768
int: 所占字节数:4 最大值:2147483647 最小值:-2147483648
unsigned: 所占字节数:4 最大值:4294967295 最小值:0
long: 所占字节数:8 最大值:9223372036854775807 最小值:-9223372036854775808
unsigned long: 所占字节数:8 最大值:18446744073709551615 最小值:0
double: 所占字节数:8 最大值:1.79769e+308 最小值:2.22507e-308
long double: 所占字节数:16 最大值:1.18973e+4932 最小值:3.3621e-4932
float: 所占字节数:4 最大值:3.40282e+38 最小值:1.17549e-38
size_t: 所占字节数:8 最大值:18446744073709551615 最小值:0
string: 所占字节数:24
type: ************size**************

https://www.cnblogs.com/leaveyourownlife/articles/3730857.html

float
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

float AverageHeight = 175.0f; // 变量赋值 将175 赋值给浮点变量AverageHeight 占用4个字节的内存(内存条)空间
float PlayerAttackPower = 100.0f; // 最常用 占用4字节
cout << AverageHeight << endl;

return 0;
}
double
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

double bulletSize = 5.5; // 一般占用8字节(X86可能是4字节) 数字取值范围更大 不需要写f 为C++默认的小数类型
double PlayerAttackDistance = 10000;
double apple = 0.0f;
cin >> apple;
cout << "apple = " << apple <<endl;

return 0;
}
integer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

int PCSize = 5;
int MyAge = 10;
int CoinNum = 100000; // 见名知意
cout << PCSize << endl;

return 0;
}
long
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

long Long_1 = 100000000L; //int是C++默认的整数类型,8字节

cout << Long_1 << endl;

return 0;
}
string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

string MyName = "XIANVFX"; // 字符串赋值

cout << MyName << endl;

return 0;
}
char
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{

//字符类型 "a"-"z", "A"-"Z", "0"-"9",",","."
char Char_a = '0';
cin >> Char_a;
cout << "Char_a : " << Char_a <<endl;
char Char_1 = 'd'; //char 1字节 ASSII对应的是字符d
cout << "Char_1:" << (int)Char_1 << endl;
int Char_2 = 88;
cout << "Char_2:" << (char)Char_2 << endl;
return 0;
}
bool
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Day01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
//bool 布尔类型 表示真(true)假(false)
bool IsHasCollider = true; //
bool IsOpened = false;
bool IsSaved = false;
bool IsLoadFiles = true;

return 0;
}

可能想问吧

C++ 第一课相对较简单没有什么想问的!


一起练习吧

  1. 输入一个数字,字母,字符串,并打印到屏幕上
  2. 使用不同的变量类型举例说明 +, -, *, / 运算。
  3. 输入一个大写字母字符,输出这个字符的小写字母。
  4. 输入一个字符,判断是不是‘q’。
  5. 输入一个字符判断是不是数字。
  6. 打印
    *
    * *
    * * *

本课作业提交源文件 [提取码:gmqq]

----------本文结束感谢您的阅读----------

本文标题:Unreal Engine 游戏开发学习笔记 20181029

文章作者:XIANVFX

发布时间:2018年10月29日 - 09:10

最后更新:2019年05月21日 - 09:05

原始链接:www.xianvfx.top/UE4/Training/Week2_CPP1/Unreal_Engine_Learning_Notes_W2_1.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

(*❦ω❦) 感谢您的支持! (*❦ω❦)
0%