自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 打造自己的库(7)随机函数

MFramework(数学工具类)概率函数(数学工具类)概率函数从传递的已知参数中 随机取值。这里用到了params 将后面传递的参数统一打包成一个数组。#if UNITY_EDITORusing UnityEditor;#endifusing UnityEngine;namespace MFramework{ public partial class MathUtil {#if UNITY_EDITOR [MenuItem("MFramework/示例

2021-04-23 22:01:25 246

原创 打造自己的库(6)整理自己当前所收集的功能

MFramework(整理)MFramework目录(整理)由于我们的知识积累和工具类越来越多,不利于我们以后的学习和使用。这就跟编程经常需要对自己的代码进行重构一样,所以我们也要对我们的文件夹层次结构进行整理。建立多个文件夹根据类的功能,和所属的大类进行分类。可以根据个人的喜好,进行自己的文件夹分类,也可以当以后收集的功能在进行分类。对(第一个功能)导出MFramework可以导出我们当前所写的库文件,并且类名有些过长,将类名更改为Exporter。#if UNITY_EDITORusin

2021-04-21 16:34:33 333

原创 打造自己的库(5)数学工具类(概率函数)

MFramework(第五个功能)数学工具类(概率函数)MFramework目录(第五个功能)数学工具类(概率函数)目的:想要一个能输入概率的数字,得到对应的概率对应的行为。概率是百分之五十 本示例是输出十次 判断对应的True和False。#if UNITY_EDITORusing UnityEditor;#endifusing UnityEngine;namespace MFramework{ /// <summary> /// 数学工具类

2021-04-20 22:46:52 297

原创 打造自己的库(4)Transform的拓展方法(归一化)

MFramework(第四个功能)Transform的扩展方法(归一化)(第四个功能)Transform的扩展方法(归一化)#if UNITY_EDITORusing UnityEditor;#endif using UnityEngine;namespace MFramework{ /// <summary> /// Transform的拓展方法 /// </summary> public static class Transform

2021-04-20 16:05:52 393

原创 打造自己的库(3)Transform的拓展方法(设置localPosition)

MFramework(第三个功能)Transform的扩展方法(设置localPosition)(第三个功能)Transform的扩展方法(设置localPosition)由于设置localPosition的值不能直接更改,每次要更改localPosition的值都需要写很多重复代码。#if UNITY_EDITORusing UnityEditor;#endif using UnityEngine;namespace MFramework{ public static clas

2021-04-19 16:36:20 432

原创 打造自己的库(2)检测屏幕分辨率

MFramework(第二个功能)判断屏幕分辨率MFramework目录(第二个功能)判断屏幕分辨率Unity 提供了 Screen.height 和 Screen.width 这两个 API 来为我们提供当前设备的⾼和宽。#if UNITY_EDITORusing UnityEditor;#endif using UnityEngine;namespace MFramework{ public class ScreenResolution {#if UNITY_EDIT

2021-04-19 14:53:06 388

原创 打造自己的库(1)一键导出自己的库

MFramework为什么要打造⾃⼰的库?(第一个示例)导出MFramework为什么要打造⾃⼰的库?在学习期间,要实现某些简单的功能,但是却需要些许多的重复的代码,要解决这个问题,就需要不断的重构,去减少我们的代码重复率,每当我们开启一个新的项目,这些问题随之而来。从编程⻆度上:可以提⾼⾃⼰的编码效率。从学习⻆度上:可以积累下来⾃⼰所学过的知识。想要学习打造自己库,这里推荐凉鞋老师(第一个示例)导出MFramework按下面目录创建第一个类。这里使用了宏定义UNITY_EDI

2021-04-17 22:43:19 457 4

原创 Unity通用类-----一键生成配置表

一键生成配置表由于发布之后需要从Resources文件对应的Config下读取配置表,而且需将.csv文件加上后缀bytes(速度快),为了避免多次操作导致,出现未知错误,所以交给计算机操作。using UnityEngine;using UnityEditor;using System.IO;public class EasyEditor : Editor{ //把配置文件放到Resources目录下 [MenuItem("Custom/ConfigToResources")

2021-04-13 20:13:49 992

原创 Unity通用类-----读取配置表

读取配置表在Assets同级目录,创建Config文件夹。在Config文件内,创建配置表,Excel表格填入要配置的数据。另存为.csv文件格式。在Unity里创建脚本ConfigTable 配置表基类using System.Collections.Generic;using UnityEngine;using System;using System.IO;using System.Text;using System.Reflection;//所有表数据的基类 存储的

2021-04-13 19:57:32 3357

原创 Unity-XLua快速学习

Unity-XLua使用Lua文件加载执行字符串加载Lua文件自定义LoaderC#访问Lua获取一个全局基本数据类型访问一个全局的table映射到普通class或struct映射到一个interface更轻量级的by value方式:映射到Dictionary<>,List<>另外一种by ref方式:映射到LuaTable类访问一个全局的function映射到delegate映射到LuaFunctionLua调用C#new C#对象访问C#静态属性,方法访问C#成员属性,方法X

2021-04-11 18:43:04 743

原创 C#基础 ----- 特殊语法

var隐式类型var是一种特殊的变量类型它可以用来表示任意类型的变量注意:var不能作为类的成员只能用于临时变量申明时也就是一般写在函数语句块中var必须初始化可空类型#region 可空类型 //值类型是不能赋值为空 //申明时在值类型后面加?可以赋值为空 int? c = 3; //判断是否为空 if (c.HasValue) {

2021-04-10 10:32:55 209

原创 C#基础 ----- 特性

特性是什么特性是一种允许我们向程序的程序集添加元数据的语言结构它是用于保存程序结构信息的某种特殊类型的类特性提供功能强大的方法以将声明信息与C#代码(类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用反射查询特性信息特性的目的是告诉编译器把程序结构的某组元数据嵌入程序集中它可以放置在几乎所有的声明中(类、变量、函数等等申明)特性本质是个类我们可以利用特性类为元数据添加额外信息比如一个类、成员变量、成员方法等等为他们添加更多的额外信息,之后可以通过反

2021-04-08 21:04:33 676

原创 C#基础 ----- 迭代器

迭代器是什么迭代器(iterator) 有时又称光标(cursor)是程序设计的软件设计模式迭代器模式提供一个方法顺序访问一个聚 合对象中的各个元素而又不暴露其内部的标识在表现效果上看是可以在容器对象(例如链表或数组)_上 遍历访问的接口设计人员无需关心容器对象的内存分配的实现细节可以用foreach遍历的类,都是实现了迭代器的标准迭代器的实现方法 #region 标准迭代器的实现方法 //关键接口口: IEnumerator,IEnumerable

2021-03-30 22:47:45 266

原创 GAMES101 闫令琪图形学 作业5

作业5问题描述实现两个部分:光线的生成和光线与三角的相交。Möller-Trumbore 算法推导光线与三角形相交时,可得如下等式://orig起点 direction射线方向 //v0,v1,v2 是三角形三个顶点 Vector3f E1 = v1 - v0; Vector3f E2 = v2 - v0; Vector3f S = orig - v0; Vector3f S1 = crossProduct(dir, E2); Vector3

2021-03-29 21:21:18 1652 3

原创 UnityShader学习笔记(凹凸映射)

法线纹理法线纹理中存储的就是表面的法线方向。由于法线方向的分量范围在[-1, 1],而像素的分量范围为[0, 1],因此我们需要做一个映射, 通常使用的映射就是:这就要求,我们在Shader中对法线纹理进行纹理采样后,还需要对结果进行一次反映射的过程,以得到原先的法线方向。反映射的过程实际就是使用上面映射函数的逆函数:在切线空间下进行光照计算 //纹理贴图 _MainTex("MainTex",2D)="white"{} //法线贴图 _BumpMa

2021-03-28 16:48:15 258

原创 GAMES101 闫令琪图形学 作业4

作业3问题描述for (double t = 0.0; t <= 1.0; t += 0.001) { auto point = recursive_bezier(control_points,t); window.at<cv::Vec3b>(point.y, point.x)[1] = 255; }递归算法if (control_points.size() == 2) return t * control

2021-03-28 12:04:34 541

原创 GAMES101 闫令琪图形学 作业3

作业3问题描述重心坐标公式:auto v = t.toVector4(); // 构建包围盒 float min_x = std::min(v[0][0], std::min(v[1][0], v[2][0])); float max_x = std::max(v[0][0], std::max(v[1][0], v[2][0])); float min_y = std::min(v[0][1], std::min(v[1][1], v[2][1]));

2021-03-27 15:21:52 1588 4

原创 GAMES101 闫令琪图形学 作业2

作业2问题描述问题分析:insideTriangle(int x, int y, const Vector3f _v)*测试点是否在三角形内,(x,y)代表P点,_v[0]代表三角形A点位置,_v[1]代表三角形A点位置,_v[2]代表三角形A点位置。根据右手定则,ABxAP 四指由AB边向AP方向握,伸出大拇指指向方向,依次做BC边,AC边,当三次大拇指指向是同一方向(指向屏幕外,指向屏幕内),则证明P点在三角形内。要进行光栅化首先得知道了哪些点在三角形内,才能进一步进行处理。更改P

2021-03-26 21:56:11 1927 5

原创 GAMES101 闫令琪图形学 作业1

作业1问题描述问题分析:第一个函数:get_model_matrix(float rotation_angle):逐个元素地构建模型变换矩阵并返回该矩阵。在此函数中,你只需要实现三维中绕 z 轴旋转的变换矩阵,而不用处理平移与缩放。绕 z 轴旋转的变换矩阵:Eigen::Matrix4f get_model_matrix(float rotation_angle){ Eigen::Matrix4f model = Eigen::Matrix4f::Identity();

2021-03-25 16:34:23 1000

原创 GAMES101 闫令琪图形学 作业0

第0次作业分析过程#include<cmath>#include <Eigen/Core>#include <Eigen/Dense>#include <iostream>int main(){ Eigen::Vector3d v(2.0f, 1.0f, 1.0f); Eigen::Matrix3d rotate; Eigen::Matrix3d tranform; double r = -45.0 / 1

2021-03-24 17:03:42 616

原创 UnityShader学习笔记(编写简单Shader入门第一步)

要编译的着色器函数在代码片段的开头,可使用 #pragma 语句的形式提供编译指令。它们将告诉Unity,哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码。#pragma vertex name - 作为顶点着色器来编译函数 name。#pragma fragment name - 作为片元着色器来编译函数 name。如果还想知道其他的编译指令点击这里每个代码片段必须至少包含一个顶点程序和一个片元程序。因此,#pragma vertex 和 #pragma fragment 指令是必

2021-03-23 09:05:41 534

原创 UnityShader学习笔记(坐标空间知识)

UnityShader学习笔记(坐标空间知识)空间变换unity中透视投影矩阵dx中投影矩阵转换opengl中投影矩阵转换unity中透视投影矩阵unity中正交投影矩阵unity屏幕空间公式法线变换法线向量是需要进行归一化的,它的长度必须为1.0。法线向量是表示方向的,跟顶点不一样不是表示位置,所以法线向量只有三个分量,不存在齐次坐标。法线向量的变换中,一般只有旋转变换和部分缩放变换。因为法线向量表示方向,平移后不变化,而且法线如果等轴缩放,归一化后也不变化,另外,法线主要

2021-03-22 15:57:15 257

原创 C#基础 ----- 反射

反射程序集的概念:程序集是经由编译器编译得到的,供进步 编译执行的那个中间产物在WINDOWS系统中,它一般表现为后缀为.d11 (库文件)或者是.exe (可执行文件)的格式。程序集就是我们写的一个代码集合,我们现在写的所有代码最终都会被编译器翻译为一个程序集供别人使用比如一个代码库文件(d11) 或者个可执行文件(exe)元数据的概念:元数据就是用来描述数据的数据这个概念不仅仅用于程序上,在别的领域也有元数据,程序中的类,类中的函数、变量等等信息就是程序的元数据有关程序以及类型的数据被称为元数

2021-03-21 20:14:47 159 1

原创 UnityShader学习笔记(基础光照)

标准光照模型虽然光照模型有很多种类,但在早期的游戏引擎中往往只使用一个光照模型,这个模型被称为标准光照模型。实际上,在BRDF理论被提出之前,标准光照模型就已经被广泛使用了。在1975年,著名学者裴祥风(Bui Tuong Phong) 提出了标准光照模型背后的基本理念。标准光照模型只关心直接光照(direct light),也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。它的基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度。

2021-03-21 16:53:16 217

原创 C#基础 ----- BitConverter 类

BitConverter 类将基数据类型转换为一个字节数组以及将一个字节数组转换为基数据类型。BitConverter类可帮助以一系列字节的形式操作其基本格式的值类型。想学习更多点击这里using System;class BitConverterDemo{ public static void Main( ) { const string formatter = "{0,25}{1,30}"; double aDoubl = 0.1111

2021-03-20 11:14:51 8328

原创 UnityShader学习笔记(三维数学知识)

UnityShader学习笔记(三维数学知识)三维坐标系矩阵方阵:nxn阶矩阵对角矩阵:nxn阶所有非对角线元素都为零单位矩阵,nxn阶所有非对角线元素为零,对角线元素为1矩阵乘法矩阵乘法特点向量矩阵相乘DX中是行向量OpenGL中是列向量旋转二维旋转矩阵三维绕X轴旋转矩阵三维绕Y轴旋转矩阵三维绕Z旋转矩阵三维绕任意n轴旋转矩阵缩放二维沿轴缩放矩阵三维沿轴缩放矩阵二维沿任意方向缩放矩阵三维沿任意方向缩放矩阵正交投影向X轴投影向Y轴投影向xy平面

2021-03-19 09:07:23 275

原创 UnityShader学习笔记(二维数学知识)

UnityShader学习笔记(数学知识)二维(笛卡尔)坐标系二维向量(矢量)具有方向的线段叫做有向线段,以A为起点、B为终点的有向线段作为向量,可以记作 v = B - A。区别于有向线段,在一般的数学研究中,向量是可以平移的。一个向量的坐标等于表示此向量的有向线段的终点坐标减去始点的坐标。二维向量运算(加法)二维向量运算(加法)二维向量运算(减法)二维向量运算(点乘)根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是

2021-03-18 20:23:55 601

原创 实现AI角色的群体操控-队列Alignment行为

队列(Alignment)行为队列行为视图保持AI角色的运动朝向与邻居一致,这样就会得到像鸟群朝着一个方向飞行的效果。通过迭代邻居,可以求出AI角色朝向向量的平均值以及速度向量的平均值,得到想要的朝向,然后减去AI角色的当前朝向,就可以得到队列操控力。C#脚本代码using UnityEngine;namespace AI.Steering{ /// <summary> /// 队列 /// </summary> public clas

2021-03-16 14:37:23 640 1

原创 实现AI角色的群体操控-分离Separation行为

分离(Separation)行为分离行为的作用是使角色与周围其他角色保持一定的距离,这样可以避免多个角色相互挤到一起。当分离行为应用在许多AI角色(如鸟群中的鸟)上时,它们将会向四周散开,尽可能拉开距离。C#脚本代码using UnityEngine;namespace AI.Steering{ /// <summary> /// 分散 /// </summary> public class SteeringForDisperse : S

2021-03-15 13:10:39 612 1

原创 实现AI角色的群体操控-聚集Cohesion行为

聚集(Cohesion)行为聚集行为产生一个使AI角色移向邻居的质心的操控力,这个操控力使得多个AI角色聚集到了一起。迭代所有邻居,求AI角色平均值,然后利用靠近行为,将平均值作为目标。C#脚本代码using UnityEngine;namespace AI.Steering{ /// <summary> /// 聚集 /// </summary> public class SteeringForCollect : Steering

2021-03-14 07:46:01 815 1

原创 实现AI角色的自主移动-群体操控行为

组行为群体操控行为,正如大多数人工生命仿真一样,组行为是展示操控行为的一个很好的例子,它的复杂度来源于个体之间的交互,并遵循一些简单的规则。模仿群体行为需要下面几种操控行为分离(Separation):避免个体在局部过于拥挤的操控力。队列(Alignment):朝向附件同伴的平均朝向的操控力。聚集(Cohesion):向附近同伴的平均位置移动的操控力。雷达(Radar)从上面几种操控行为可以看出,每种操控行为都决定角色对相邻的其他角色做出任何反应。为了实现组行为,首先需要检测位于当前AI角

2021-03-13 08:06:08 714 2

原创 【C#】制作简单的飞行棋小游戏

飞行棋双人小游戏目标:实现飞行棋游戏基础功能玩家在地图触发道具:获得道具,可以进行一次选择 1–交换位置 2–让对方退随机格子踩到炸弹,让对方暂停一回合乘上了飞机,前进10格进入隧道,将随机从其他隧道口出来using System;namespace FXQGame{ class Program { //储存地图数组 static int[] mMaps = new int[100]; //储存两个玩家的坐标

2021-03-12 20:37:57 2146

原创 实现AI角色的自主移动-避开障碍物Obstacle行为

避开障碍物(Obstacle)行为避开障碍物行为是指操控AI角色避开路上的障碍物,例如动物奔跑时,避免与树、墙碰撞。当AI角色的行进路线上发现比较近的障碍时,产生一个排斥力,是AI角色远离这个障碍物。using UnityEngine;namespace AI.Steering{ public class SteeringForEvadeObstacle : Steering { //字段 //障碍物标记 public string

2021-03-12 09:57:52 1603

原创 实现AI角色的自主移动-路径跟随Path Following行为

路径跟随(Path Following)行为C#脚本代码using System;using UnityEngine;namespace AI.Steering{ /// <summary> /// 路径跟随:算法如同巡逻 需要路点 /// </summary> class SteeringForFollowPath : Steering { public enum PartolMode {

2021-03-11 08:07:03 1665

原创 实现AI角色的自主移动-徘徊Wander行为

徘徊(Wander)行为许多时候,人们需要让游戏中的角色在游戏环境中随机移动(如巡逻的士兵、惬意吃草的牛羊等),就像这些角色是在等待某些事情发生,或者是在寻找什么东西,当角色出现在玩家视线中,人们通常希望这种随机移动看上去是真实的,如果玩家发现角色实际上是在沿事先预定好的路径移动,就会有不真实的感觉,那么便会影响到他的游戏体验。随机徘徊行为就是让角色产生有真实感的随机移动,那么这会让玩家感觉角色是有生命的,而且正在到处移动。using UnityEngine;namespace AI.Steer

2021-03-10 08:23:50 1015 1

原创 实现AI角色的自主移动-逃避Evade行为

逃避(Evade)行为逃避行为是指猎物躲避捕猎者的行为,举例说明:鹿被狼追逐,鹿要不断变化逃跑方向,试逃离狼预测的追逐方向。与追逐行为算法相似。C#脚本代码using UnityEngine;/// <summary>/// 逃避与拦截相似/// </summary>namespace AI.Steering{ /// <summary> /// 逃避 /// </summary> public class

2021-03-09 12:39:13 1190

原创 实现AI角色的自主移动-追逐Pursuit行为

追逐(Pursuit)行为追逐行为也叫拦截行为,与靠近算法很像,只不过如果模拟动物追逐猎物的时候,绝不是直接向猎物的当前位置奔跑,而是预测猎物的未来位置,然后向着未来位置的方向追去,这样才能在最短时间内追上猎物。实现追逐行为的一个关键是如何确定预测间隔T,我们可以把它设成一个常数,也可以当追逐者距离目标较远时设较大的值,而接近目标时,设为较小的值,也可以设定预测时间和追逐者与逃避者之间的距离成正比,与二者的速度成反比。一般情况下,追逐行为可能会提前结束,当逃避者在追逐者前方,那么追逐者直接向逃避者的当

2021-03-08 10:06:33 753

原创 实现AI角色的自主移动-抵达Arrival行为

抵达(Arrival)行为有时我们希望AI角色能够减速并停在目标位置,避免冲过目标。当角色距离目标较远时,抵达和靠近行为状态一样,但是接近目标时,不再是全速向目标前进,而是减速,最终恰好停到目标位置。设置一个减速区和到达区域,当AI角色进入减速区,速度逐渐减小到预期速度,直到到达区域,AI角色停止移动。C#脚本代码using UnityEngine;namespace AI.Steering{ /// <summary> /// 抵达 /// </

2021-03-07 12:49:19 522

原创 实现AI角色的自主移动-离开Flee行为

离开(Flee)行为离开和靠近行为正好相反,它产生一个操控AI角色离开目标的力,而不是靠近目标的力。可以进一步调整,当AI角色进入一定范围内,才产生离开的力,这样可以模仿出AI角色的有限感知范围。C#脚本代码using UnityEngine;namespace AI.Steering{ /// <summary> /// 远离 /// </summary> public class SteeringForFlee:Steering

2021-03-06 19:33:53 431

原创 实现AI角色的自主移动-靠近Seek行为

靠近(Seek)行为操控行为中的靠近是指,指定一个目标位置,根据当前的运动速度向量,返回一个操控AI角色到达该目标位置的“操控力”,使AI角色自动向该位置移动。要想AI角色靠近目标,首先需要计算出AI角色在理想情况下到达目标的预期速度,该速度可以看作是从AI角色的当前位置到目标位置的向量。操控向量是预期速度与AI角色当前速度的差,该向量大小随着当前位置变化而变化,从而形成图中的靠近路线。using UnityEngine;namespace AI.Steering{ /// <s

2021-03-05 10:20:43 910

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除