圆内的笛卡尔方程:
极坐标:
随机点(x, y):
第一遍透视绘制:ZWrite Off、Greater。(关闭深度缓存)
第二遍正常绘制:ZWrite On、LEqual。
- 估价函数:f(n) = g(n) + h(n)
- g(n):从起点到节点n的最短路径。
- h(n):从节点n到终点的最短路径的启发值。
- 曼哈顿距离:h(n) = x + y
- 特殊情况:当h(n)等于0时,A*算法等于Dijkstra算法。
while(OPEN!=NULL)
{
从OPEN表中取f(n)最小的节点n;
if(n节点==目标节点)
break;
for(当前节点n的每个子节点X)
{
计算f(X);
if(XinOPEN)
if(新的f(X)<OPEN中的f(X))
{
把n设置为X的父亲;
更新OPEN表中的f(n);
}
if(XinCLOSE)
continue;
if(Xnotinboth)
{
把n设置为X的父亲;
求f(X);
并将X插入OPEN表中;//还没有排序
}
}//endfor
将n节点插入CLOSE表中;
按照f(n)将OPEN表中的节点排序;//实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}//endwhile(OPEN!=NULL)
- public enum Transition // 状态转换条件
NullTransition = 0
FindPlayer = 1
LosePlayer = 2
- public enum StateId // 状态唯一标识
NullStateId = 0
Patrol = 1
Chase = 2
- public abstract class FSMState // State基类
private Dictionary<Transition, StateId> transDict; // Transition字典
public StateId stateId; // State Id
public FSMSystem fsm; // 状态机
...
public void AddTransition(Transition trans, StateId id); // 添加Transition
public void RemoveTransition(Transition trans); // 移除Transition
public StateId GetState(Transition trans); // 获取State
public virtual void DoBeforeEnter() { } // 进入State之前
public virtual void DoBeforeExit() { } // 退出State之前
public abstract void DoUpdate(); // 在State中
- public class FSMSystem // 状态机系统
private Dictionary<StateId, FSMState> stateDict; // State字典
public FSMState currentState; // 当前State
...
public void AddState(FSMState state); // 添加State
public void RemoveState(FSMState state); // 移除State
public void DoTransition(Transition trans); // 执行Transition
public void StartState(StateId id); // 开始State
- public class NPCController // NPC控制器...
- public class ChaseState // 追逐状态...
- public class PatrolState // 巡逻状态...
- public class PlayerMove // 角色移动...
- public class FollowPlayer // 跟随角色...
- Singleton(普通单例)
public abstract class Singleton<T>
where T : new()
{
private static T _instance;
private static object _lock = new object();
public static T Instance
{
get
{
if (_instance == null)
{
// 上锁,防止重复实例化
lock (_lock)
{
if (_instance == null)
{
_instance = new T();
}
}
}
return _instance;
}
}
}
- UnitySingleton(组件单例)
public class UnitySingleton<T> : MonoBehaviour
where T : Component
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
// 利用反射创建 Unity 物体
_instance = FindObjectOfType(typeof(T)) as T;
if (_instance == null)
{
GameObject obj = new GameObject();
// 利用反射创建 Unity 组件
_instance = obj.AddComponent(typeof(T)) as T;
}
}
return _instance;
}
}
public virtual void Awake()
{
DontDestroyOnLoad(this.gameObject);
if (_instance == null)
{
_instance = this as T;
}
else
{
Destroy(this.gameObject);
}
}
}
-
DOTS:Data-Oriented Tech Stack,面向数据的技术堆栈
-
ECS:数据和逻辑解耦,CPU缓存友好。
-
Job System:多核编程。
-
Burst Compiler:优化编译。
-
导包:Window -> Package Manager -> Add package from git URL -> com.unity.rendering.hybrid
-
调试:Window -> Analysis -> Entity Debugger
- 说明
lua-5.4.0_Win64_bin.zip
lua54.dll
lua54.exe -- 重命名为lua.exe
luac54.exe
wlua54.exe
lua-5.4.0_Win64_dllw6_lib.zip
include/*
liblua54.a -- 静态链接库
lua54.dll -- 动态链接库
lua.h
: 基础函数,均为lua_前缀。lauxlib.h
: 辅助库,均为luaL_前缀。lualib.h
: 标准库,大部分为luaopen_前缀,以及luaL_openlibs。
【Lua和C之间通信的主要组件是无处不在的虚拟栈(stack),几乎所有的API调用都是在操作这个栈中的值,Lua与C之间所有的数据交换都是通过这个栈完成的。此外,还可以利用栈保存中间结果。】
- 使用
g++参数:
-l 链接库
-L 链接库目录
-I include
add.lua:
function add(x, y)
return x + y
end
add.cpp:
int luaadd(int x, int y)
{
int sum;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2 arguments, return 1 result */
lua_call(L, 2, 1);
/* get the result */
sum = (int)lua_tointeger(L, -1);
lua_pop(L, 1);
return sum;
}
g++ add.cpp -o add -llua54 -L ./lib -I ./include
=> add.exe
avg.cpp:
static int average(lua_State *L)
{
/* get number of arguments */
int n = lua_gettop(L);
double sum = 0;
int i;
/* loop through each argument */
for (i = 1; i <= n; i++)
{
/* total the arguments */
sum += lua_tonumber(L, i);
}
/* push the average */
lua_pushnumber(L, sum / n);
/* push the sum */
lua_pushnumber(L, sum);
/* return the number of results */
return 2;
}
average.lua:
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
g++ avg.cpp -o avg -llua54 -L ./lib -I ./include
=> avg.exe