Corgi Engine快速指南(2)——创建敌人AI
这篇文章还没写完
经过上一篇文章的介绍,我们已经能够在引擎中实现玩家移动、跳跃、奔跑等一系列行为了。现在,我们要往场景中引入能够对玩家作出反应的敌人AI。
本节目标:创建一个持有近战武器 (melee weapon) 的巡逻敌人“持剑战狗”,在侦察到玩家后进入警觉状态(停顿、头顶冒出感叹号),经过 1 秒开始追赶玩家,追上时使用近战攻击(具有前摇)敌人的每次攻击会对玩家造成 1 点伤害。
持剑战狗创建一把近战武器我们可敬的敌人需要一把对付邪恶玩家的武器。
创建一个新的空对象,将其命名为 MeleeWeapon,添加 MeleeWeapon 组件
将此对象拖到项目中的文件夹中以制作预制件,然后从场景中删除它
按照上一篇文章的方式创建一个敌人AI,将 MeleeWeapon 预制件拖到敌人AI的 CharacterHandleWeapon 脚本(如果没有,就新建一个)的 InitialWeapon 中
现在我们可敬的敌人就拥有了一把武器!
调整武器参数在刚才添加的 MeleeWeapon 脚本中,设置以下参数:
触发模式(Trigger Mode):半自动
攻击持续时间为 0. ...
Corgi Engine快速指南(1)——如何搭建第一个关卡?
首先得有一个场景
引擎文档
引擎API文档
视频教程
在Corgi Engine中如何搭建最简单的场景?引擎已经为我们准备了配置好基础数据的预制件,我们可以直接拖入新建场景中,一个场景最少所需的预制件分别是:
GameManagersUI CameraLevelManagerCameraLevel
路径:CorgiEngine/Common/Prefabs/LevelManagers/GameManagers
包含了Game Manager、Sound Manager、Achievement Rules 和 Time Manager,以组件的形式添加在物体上。
负责处理得分、时间系数(游戏时间快慢)、暂停、设置解锁成就/增加进度的条件等功能。如果不需要其中的某些管理器,可以删除。
路径:CorgiEngine/Common/Prefabs/GUI/UICamera
不论游戏是否有UI,UI相机都需要加入场景中,因为预制件上附加了InputManager,这是玩家控制角色的关键组件(我也不知道为什么引擎不把这个mgr放到GameManagers上)。
你可以把所有GUI相关的 ...
2024GGJ🌏 - CluckCluck复盘——新输入系统与手柄控制
新输入系统(Input System)Unity的新输入系统是一个基于事件的新系统,它在编辑器里提供了一个中间层(Input Action Asset),用户可以在其中自定义一系列玩家动作和其对应的操作。例如在CluckCluck中,我设定了移动(left joystick)、冲刺(B)、拾取道具(right trigger)三个控制:
完成操作设置之后,保存Input Action资产,在其检查器中可以点击生成对应的C#类,接下来就可以在代码中通过事件绑定的方法使用这些操作监听。
代码解析生成的C#代码取决于用户设定的控制逻辑的复杂程度,实现了 IInputActionCollection2 和 IDisposable 接口。
接口IInputActionCollection2从命名上可以看出该接口用于过渡 IInputActionCollection 接口的功能。
1234567891011121314151617using System.Collections;using System.Collections.Generic;namespace UnityEngine.Inp ...
《C++游戏编程:创建3D游戏》—— 游戏循环
第一章 游戏循环前言该内容是 《C++游戏编程:创建3D游戏》 的笔记,作者用它来学习游戏引擎最基础的知识,即归纳要点,因此不会在里面插入过多的代码内容。
什么是游戏循环通常来讲,游戏程序与别的程序不同的是,只要游戏程序在运行,每一秒都需要对游戏程序多次更新(纯文字游戏可能不需要)。通常来讲,每一次完整的游戏循环被称为一帧(frame)。60帧率(FPS frame per second)的游戏意思是游戏每秒完成60次循环。
游戏循环的工作归纳来讲,每次游戏循环游戏引擎都在做这三个动作:
处理输入指处理和游戏有关的任何输入,对于通常的PC即处理键鼠输入,如果有手柄等外接设备则需要处理手柄的输入。而对于联网游戏来说,需要处理来自服务器端的输入。对于AR游戏,也需要处理相机相关的输入。
更新游戏世界检查游戏中每个对象的状态,并且对这些对象进行更新。更新游戏世界可能涉及非常多的对象,包括游戏中的人物,UI,音频等内容。以及时钟等非直观可见的游戏对象。
生成输出生成游戏的一切输出,最直观的输出即图形输出,同时也包括音频等输出内容,震动也是一种输出形式。
注:这是标准的单线程游戏循环 ...
基于快速傅里叶变换(FFT)的水体模拟
基于快速傅里叶变换(FFT)的水体模拟请注意本文含有大量公式,涉及大量理论和计算,建议阅读时自行推导可能有没写清楚的地方,这几天我修一下博客评论区
FFT全称为Fast Fourier Transform,即快速傅里叶变换,因其卓越的视觉模拟效果而被应用于好莱坞的影视行业中。经典电影《泰坦尼克号》中的海水就是由FFT实现的。这种模拟方法最早于2004年在Jerry Tessendorf的 Simulating Ocean Water 论文中提出。论文原文:https://people.cs.clemson.edu/~jtessen/reports/papers_files/coursenotes2004.pdf
快速傅里叶变换是快速计算序列的离散傅里叶变换(DFT)或其逆变换的方法。傅里叶分析将信号从原始域(通常是时间或空间)转换到频域的表示或者逆过来转换。FFT会通过把DFT矩阵分解为稀疏(大多为零)因子之积来快速计算此类变换。因此,它能够将计算DFT的复杂度从只用DFT定义计算需要的 $O(n^{2})$,降低到 $O(n\log n)$,其中 $\displaystyle n ...
基于Gerstner Wave算法的海洋实现
介绍Sin Wave的局限在引入Gerstner Wave之前,人们更多使用正弦波来模拟海浪,因为正弦波天生具有类似海浪的形状。但它的局限也很明显,那就是波峰过于圆润,纵然有办法通过代数方法约束波峰的形状,但效果还是无法达到预期的尖锐。
什么是Gerstner WaveGerstner Wave是Sin Wave的后继者,到现在也是一种常用的用来模拟海洋波浪的算法。他的历史其实已经很古老了,可以追溯到1986年。相比于快速傅里叶变换(FFT),Gerstner Wave方法的开销更小,效果也很真实,因此被更多的应用与游戏领域(FFT更适合影视行业,因为它的效果更好但开销更大)。Gerstner Wave的公式如下:
P(x,y,t) = \begin{pmatrix}x + \sum({Q_{i}A_{i} * D_{i}.x * \cos(\omega_{i} D_{i}(x,y) + \varphi t})) \\y + \sum({Q_{i}A_{i} * D_{i}.y * \cos(\omega_{i} D_{i}(x,y) + \varphi t})) \\\sum( ...
Elemental Universe/元素宇宙 - 地图与人物关系设计
var nodes = [
{
"id": "0",
"name": "观察者",
"symbolSize": 45,
"x": 0,
"y": 0,
"value": "处于更高维度的世界创始人",
"category": 0
},
{
"id": "1",
"name": "氢/海卓尔根",
"symbolSize": 30,
"x": -100,
"y": -150,
"value": "第一个进入小宇宙的人,I族实际上的掌控者",
"category": 1
},
{
"id": "2",
"name": "氦/赫琉姆",
"symbolSize": 28,
"x": -100,
"y": 150,
...
水面、波浪、白沫和焦散
请注意由于微博图床外链失效,本文部分图片无法获取
介绍与准备我最近打算开始做毕设项目的场景啦XD!这个项目的名字叫元素宇宙(Elemental Universe),是一个化学元素拟人世界观下的小宇宙的故事,目前只有我一个人在做,第一步是搭场景。主场景打算用polyBrush磨出来,其中有一些湖泊和海洋。海洋部分我打算用GerstnerWave的方法来做,湖泊部分采用本文所介绍的方法(当然,还有很多可以改进的地方。有改进的部分会在“更新说明”里提及)。
废话交代完了,现在正式开始吧:
首先,准备一个细分好的平面(因为我们需要一定数量的顶点)作为水面。在这个项目中我使用的是:
演示模型来自Sketchfab,使用遵守CC版权协议。如下预览所示,模型原本的水面只是一块普通的、smooth值几乎设置为1的水平面:
Little Pond & fish by Kenny Kwok. on Sketchfab
波浪波浪的基本原理是顶点动画,通过修改水面顶点y值(高度)实现,这也是为什么前文提到我们需要一块顶点数比较多的面,越多的顶点意味着越高的波浪精细程度。
我们现在希望的事 ...
查找表(LUT)的应用
颜色分级 当我们拿到了一个场景,而我们想要改变它的颜色该怎么办?比如说现在我们有一个暖色调的魔女小屋,但我们希望能够实现一个更阴暗一点的风格。想要置换场景中所有模型的贴图、改变光照显然是不合适的,它的工作量太过庞大,并且如果还想更改色调的话我们又需要重新绘制一套纹理,这显然是划不来的。
我们其实很容易的能够联想到一种与之关联的屏幕后处理(Post-Processing)效果,叫做颜色分级(Color Grading)。颜色分级是一个功能非常强大的后处理效果,我们可以利用该效果给屏幕加上各种“滤镜”,得到想要的效果。这个组件比较复杂,在本文中不过多展开,详情可见官方文档:https://docs.unity3d.com/2018.3/Documentation/Manual/PostProcessing-ColorGrading.html
LUT 有了这么强大的工具游戏开发者是不是就可以高枕无忧了呢?答案是:不可以!颜色分级虽然强大,但相对的它的开销也是很大的,在移动平台如果依赖颜色分级实现某些效果的话会出现手机发烫、 ...
贴地雾效实现
接上篇文章画的饼,这回我打算试着实现一下雾效,我们最终的目标就是实现类似下图的效果。当然,纪念碑谷中的不怎么被雾影响的方块和浸泡在雾气中的方块使用的应该是两种shader,他们不会混在一起。但如果我们要实现的是一个可以移动的场景呢?使用我想在纪念碑谷的静态贴地雾效上加点东西,即:当摄像机移动时,雾的范围会随着摄像机的移动而移动,始终做到远处模糊、近处清晰的效果。
思路其实我们实现纪念碑谷中的这种雾效的思路和全局渐变非常类似。总结一下,主要有以下两点需求:
离摄像机越远,雾气越浓,具体表现在物体整体与雾气的颜色相融
离摄像机越近,雾气越轻,具体表现在雾气很浅,几乎消失
即,离相机较远的物体如下左所示;离相机较近的物体如下右所示:
我们可以调整地平线(渐变中心位置)的值来实现这个效果。当一个物体离摄像机较近时,它的渐变中心也较低;反之则较高。
实现变量我们需要这么几个变量:
渐变纹理
主色调
雾的颜色
雾的浓度
12345678Properties{ _RampTex("渐变纹理 ...