-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.xml
504 lines (426 loc) · 47.3 KB
/
index.xml
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Paradoxical</title>
<link>https://yathenstianbase.github.io/</link>
<description>Recent content on Paradoxical</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 05 Jan 2023 01:15:29 +0100</lastBuildDate><atom:link href="https://yathenstianbase.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>temas</title>
<link>https://yathenstianbase.github.io/categoria/temas/</link>
<pubDate>Wed, 04 Jan 2023 23:21:18 +0100</pubDate>
<guid>https://yathenstianbase.github.io/categoria/temas/</guid>
<description></description>
</item>
<item>
<title>sintaxe</title>
<link>https://yathenstianbase.github.io/categoria/sintaxe/</link>
<pubDate>Wed, 04 Jan 2023 23:21:06 +0100</pubDate>
<guid>https://yathenstianbase.github.io/categoria/sintaxe/</guid>
<description></description>
</item>
<item>
<title>title</title>
<link>https://yathenstianbase.github.io/tags/shortcodes/</link>
<pubDate>Wed, 04 Jan 2023 11:51:36 +0100</pubDate>
<guid>https://yathenstianbase.github.io/tags/shortcodes/</guid>
<description></description>
</item>
<item>
<title></title>
<link>https://yathenstianbase.github.io/posts/unity3d/unity3dscriptablerenderingpileline/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/unity3dscriptablerenderingpileline/</guid>
<description>Scriptable Render Pipeline
Unity中SRP管线简化代码构成;
定义SRP资源文件, 对象包含关系为 RenderPipelineAsset -&gt; RenderPipeline -&gt; CRenderer;
CSRPA.cs 定义SRP资源类
[CreateAssetMenu(menuName = &#34;CSRPA&#34;)] public class CSRPA : RenderPipelineAsset { public bool isUseSRPBatching; protected override RenderPipeline CreatePipeline() { return new CSRP(isUseSRPBatching); } } CSRP.cs 定义渲染管线类
internal class CSRP : RenderPipeline { CRenderer crenderer = new CRenderer(); private bool isUseSRPBatching; public CSRP(bool isUseSRPBatching) { this.isUseSRPBatching = isUseSRPBatching; GraphicsSettings.useScriptableRenderPipelineBatching = isUseSRPBatching; } protected override void Render(ScriptableRenderContext context, Camera[] cameras) { foreach (Camera cam in cameras) { crenderer.</description>
</item>
<item>
<title>About</title>
<link>https://yathenstianbase.github.io/about/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/about/</guid>
<description>Coding
Thinking
Gaming
Feel free to contact with me : [email protected]</description>
</item>
<item>
<title>Accessibility Levels in C# [C#可访问级别]</title>
<link>https://yathenstianbase.github.io/posts/csharp/accessibility-levels/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/csharp/accessibility-levels/</guid>
<description>访问修饰符 public - 全局访问,可跨程序集; private - 只能由包含类访问; protected - 只能由包含类和包含类的继承类访问; internal - 只能由当前程序集访问; sealed - 不属于访问修饰符,表示一个类不可被继承; protected internal - 可被其他程序集中的派生类所访问; namespace Assembly1 { public class Greet { protected internal string msg=&#34;Hello&#34;; } class Program { static void Main(string[] args) { Greet greet = new Greet(); Console.WriteLine(greet.msg); Console.ReadLine(); } } } // access Assembly1 using Assembly1; namespace Assembly2 { // derived class of Greet class Program: Greet { static void Main(string[] args) { Program greet = new Program(); // 此处可以跨程序集访问&#34;protected internal&#34;修饰的变量 msg Console.</description>
</item>
<item>
<title>Android ADB Tool [ADB工具命令]</title>
<link>https://yathenstianbase.github.io/posts/android/android-adb-tool/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/android/android-adb-tool/</guid>
<description> 命令: 查看帮助: adb --help 查看连接设备: adb devices 开启无线网络连接: adb tcpip port (默认5555) 使用无线网络连接: adb connect ip_address 连接shell: adb -s 指定设备 shell 倒出配置: dumpsys 使用dumpsys 命令查找app启动入口(注意 Activity Resolver Table: 下的 android.intent.action.MAIN: 之后一般包含的就是启动activity); 启动app: am start {包(package)名}/{包名}.{活动(activity)名称} </description>
</item>
<item>
<title>BubbleSort [冒泡排序可视化]</title>
<link>https://yathenstianbase.github.io/posts/dsa/bubblesort-code/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/dsa/bubblesort-code/</guid>
<description>冒泡排序的简单可视化,利用协程对冒泡排序进行分步骤执行;
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class BubbleSort : MonoBehaviour { // info public Text info; public Text statistics; public Button startbutton; // 可选开关 public bool IsManully = false; [SerializeReference] public int[] numbers = new int[10]; public bool isRandomNum = false; public int RandomMin = -9; public int RandomMax = 9; // 协程 Coroutine numCoroutine; // 递归 IEnumerator numEnumerator; Coroutine coroutineSort; Coroutine coroutineObj; // 动画事件 public delegate void SwitchEvent(int first, int last); public static SwitchEvent switchEvent; // 展示层 public GameObject BubblePrefab; public GameObject[] Bubbles; void Start() { StartCoroutine(Init()); // 冒泡排序 // Sort(); // Print(numbers); // numCoroutine = StartCoroutine(CoroutinePrint(numbers)); // numEnumerator = numbers.</description>
</item>
<item>
<title>Build Android apk in Unity [在Unity中进行安卓打包]</title>
<link>https://yathenstianbase.github.io/posts/unity3d/build-android-apk-in-unity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/build-android-apk-in-unity/</guid>
<description>在Unity中发布Android包,一般需要以下工具:
JDK Android SDK Android NDK &ndash; 原生组件需要 Gradle 以上工具可以使用Unity提供的,也可以自己单独配置; 在Preference -&gt; External Tools面板中设置路径;</description>
</item>
<item>
<title>C# Enum type [C#之枚举类型]</title>
<link>https://yathenstianbase.github.io/posts/csharp/csharp-enum-type/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/csharp/csharp-enum-type/</guid>
<description>枚举属于值类型,有一组一组的常量和整型值(Int32)组成; C#中使用枚举类型,有利于代码的可读性; 声明格式: 根据&quot;Naming rule violation&quot;说明,枚举命名的头需要建议大写,这可以在visualstudio的提示中看到; enum Name : type { key = &lt;value1&gt;, key = &lt;value2&gt;, key = &lt;value3&gt; } 等号左边相当于变量引用,右边为变量值,type表示这个枚举中的数据类型,VS的提示中包括{byte,sbyte,short,ushort,int,uint,long,ulong}; 默认的类型应该为int,并且数值是按照声明顺序从0依次递增; enum Number : int { zero = 0, // 若自定第一顺位的值,则后续值依次增加1 one, two } // 另一种形式 enum Number{zero,one,two} Enum 提供一些实用的静态方法: 比较枚举的方法; 枚举与字符串互转: 枚举转换为字符串 enum Colors { Red, Green, Blue, Yellow }; Colors.Green.ToString() // 输出&#34;Green&#34;字符串 // 利用Enum的静态方法GetName()与GetNames() // public static string GetName(Type enumType,Object value) // public static string[] GetNames(Type enumType) Enum.</description>
</item>
<item>
<title>C# Ref type [C#引用类型]</title>
<link>https://yathenstianbase.github.io/posts/csharp/csharp-ref-type/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/csharp/csharp-ref-type/</guid>
<description>引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两种变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量(in、ref 和 out 参数变量除外;请参阅 in、ref 和 out 参数修饰符)。
引用类型声明关键字:
class interface delegate record 内置引用类型
动态类型; dynamic 类型表示变量的使用和对其成员的引用绕过编译时类型检查。 改为在运行时解析这些操作; 对象类型; object 类型是 System.Object 在 .NET 中的别名; 字符串类型; string 类型表示零个或多个 Unicode 字符的序列。 string 是 System.String 在 .NET 中的别名; 委托类型; 在 .NET 中,System.Action 和 System.Func 类型为许多常见委托提供泛型定义;委托可以被实例化; 枚举类型本身为值类型,但是.NET提供了System.Enum类,所以枚举中会有一个静态方法Enum.ToObject()用于做转换;
Ref:
[引用类型定义](&gt; https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/reference-types)
结构体和类的区别</description>
</item>
<item>
<title>C# Value type [C#值类型]</title>
<link>https://yathenstianbase.github.io/posts/csharp/csharp-value-type/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/csharp/csharp-value-type/</guid>
<description>值类型的变量包含类型的实例; 在内存分配上,值类型可以存储再栈和堆中,引用类型存储在堆上; 默认情况下,在分配中,通过将实参传递给方法并返回方法结果来复制变量值。 对于值类型变量,会复制相应的类型实例; 值类型在继承体系中由ValueType类表示; 值类型保存的数据在传递前后是独立的;
// 伪码 int val = 3.14f; 传递进方法 change(int val) { val += 1.00f; print(val); // 第一次打印为 4.14 } print(val); // 第二次打印为 3.14 值类型的种类
C# 提供以下内置值类型,也称为“简单类型”,所有简单值都是结构类型: 整型数值类型 &mdash; .NET类型
sbyte &mdash; System.Sbyte byte &mdash; System.Byte short &mdash; System.Int16 ushort &mdash; System.Uint16 int &mdash; System.Int32 uint &mdash; System.UInt32 long &mdash; System.Int64 ulong &mdash; System.UInt64 nint &mdash; System.IntPtr nuint &mdash; System.UIntPtr 浮点型数值类型 - .NET类型
float System.Single double System.</description>
</item>
<item>
<title>C++ Native plugin for Unity [Unity C++原生插件管理]</title>
<link>https://yathenstianbase.github.io/posts/plugin/c++nativeforunity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/plugin/c++nativeforunity/</guid>
<description>相关插件 UnityNativeTool
Unity提供的原生插件加载功能,在加载之后不能主动卸载,需要重新启动Unity,如果需要调试C++代码的话会非常的不方便;
UnityNativeTool可以很方便的在Editor Runtime期间进行C++ dll 的加载和卸载;
安装方式: git clone 源码之后解压到Unity项目的Assets目录下,某些Unity版本如果出现报错(error CS0246),是因为Api Compatibility Level设置为.net standard 2.0,而.net standard 2.0不支持emit导致的; 添加空物体,并挂载DllManipulatorScript脚本; 启用&quot;Enable in Edit Mode&quot;, 开启后会自动在程序退出时候卸载C++ dll; Dll path pattern默认有&quot;__&quot;,Unity打包之后可能会识别不了;(去掉或者打包手动修改可修复) 接下来可以编写C++ 和 C#文件做交互了,一个简单的示例:
Visual Studio 2019 新建 C++ library 项目,并编写如下头文件和C++文件: NativeTest.h 头文件
#pragma once #include &lt;cstring&gt; extern &#34;C&#34; __declspec(dllexport) float NativeStart(); extern &#34;C&#34; __declspec(dllexport) float NativeEnd(); //编译器常量 extern &#34;C&#34; __declspec(dllexport) constexpr float ConstexprMethod(); extern &#34;C&#34; __declspec(dllexport) bool ReturnMyType(); class NativeClass { public: int i; float f; double d; char c; char* cp; NativeClass(); ~NativeClass(); }; template&lt;typename MyType&gt; struct my_type_struct { static constexpr bool boolval = false; }; template&lt;typename E&gt; constexpr bool has_flag(E lhs, E rhs) { //return (lhs &amp; rhs) == rhs; return (lhs == rhs); } NativeTest.</description>
</item>
<item>
<title>CocosCreator [CocosCreator 接口]</title>
<link>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator/</guid>
<description>cocos3D
动画 支持gtlf格式; 有Animation动画编辑器; 可以在脚本中使用Animation组件; 支持动画事件,可在关键帧中插入事件; Collider2D 需要RigidBody2D的enable contact listener属性设置为 True,才会触发碰撞效果并触发碰撞事件; this._rigid.type = ERigidBody2DType.Dynamic; // Bug? 在碰撞回调函数中使用此语句,会发生严重报错! </description>
</item>
<item>
<title>CocosCreator API [CocosCreator 接口]</title>
<link>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator-api/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator-api/</guid>
<description>使用Quat进行旋转
碰撞体事件绑定
2D on()绑定 start () { PhysicsSystem2D.instance.on(Contact2DType.BEGIN_CONTACT, this.onBeinContact, this); } onBeinContact (a: Collider2D, b: Collider2D) { this.addContact(a); } 从欧拉角转换为四元数
// 三个维度的角度数值 @property(Number) public x: number = 0; @property(Number) public y: number = 0; @property(Number) public z: number = 0; update(deltaTime: number) { this.node.rotation = Quat.fromEuler(new Quat(),this.x,this.y,this.z); this.p +=deltaTime * 1; } 射线检测
点检测需要传入UI坐标上的点: PhysicsSystem2D.instance.testPoint(event.getUILocation()) 自带的tween动画api
旋转 import { tween } from &#39;cc&#39;; @property time = 6; @property angle = 360; start () { tween(this.</description>
</item>
<item>
<title>CocosCreator Project Upgrade [CocosCreator 旧项目升级]</title>
<link>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator-project-upgrade/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/cocoscreator/cocoscreator-project-upgrade/</guid>
<description>版本为2.x的项目先升级至2.4.3及以上版本,再进行3.x版本以上升级;
代码API的变化
声明类型 // 新 旧 // @type(t) @property(t) // @integer @property(CCInteger) // @float @property(CCFloat) // @string @property(CCString) // @boolean @property(CCBoolean) --- import { _decorator, CCInteger, Node } from &#39;cc&#39;; const { ccclass, property, integer, float, boolean, string, type } = _decorator; @ccclass class MyClass { @integer // Declare that the cc type of the property _id is a Cocos integer private _id = 0; @type(Node) // Declare that the cc type of the property _targetNode is Node private _targetNode: Node | null = null; @type([Node]) // declare the cc type of the property _children as a Node array private _children: Node[] = []; @property private _count = 0; // the cc type is not declared, and it is inferred from the evaluation result of the initializer as a Cocos floating point number @type(String) // Warning: Constructor should not be used String // equivalent to CCString private _name: string = &#39;&#39;; @property private _children2 = []; // The cc type is not declared, inferred from the evaluation result of the initializer: the element is an undefined Cocos array } Ref</description>
</item>
<item>
<title>CocosMario</title>
<link>https://yathenstianbase.github.io/projects/minigame/cocosmario/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/projects/minigame/cocosmario/</guid>
<description>使用CocosCreator制作的类马里奥的平台跳跃小游戏,包含3D场景和2D场景;
项目地址: https://github.com/YathenStianbase/CocosMario-like https://yathenstianbase.github.io/projects/minigame/cocosmario/
运行截图:
&ndash;&gt; </description>
</item>
<item>
<title>Command Pattern [命令模式]</title>
<link>https://yathenstianbase.github.io/posts/designpattern/command-pattern/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/designpattern/command-pattern/</guid>
<description>属于行为类型模式
将行为定义为命令类,需要执行命令的对象被作为参数传入命令类中,Invoer可以控制命令的回撤的回做;
一般包含成员:
Receiver 命令接收者,命令的执行者; 抽象命令接口, 定义需要执行的方法,并交由子类来实现; 具体命令类,继承抽象命令接口,接受传入的命令接收者对象后,执行它们的行为; 调用命令者,调用传入的命令; Receiver 命令接收者
public class Receiver { public void Action() { Console.WriteLine(&#34;Called Receiver.Action()&#34;); } public void UndoAction() { Console.WriteLine(&#34;Called Receiver.UndoAction()&#34;); } } ICommand 抽象命令接口
public interface ICommand { void Execute(); void Undo(); } public abstract class Command : ICommand { protected Receiver receiver; public abstract void Execute(); public abstract void Undo(); } 具体命令类
class Add : Command { // 构建函数,传入Receiver public Add(Receiver receiver) { this.</description>
</item>
<item>
<title>Contact</title>
<link>https://yathenstianbase.github.io/contact/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/contact/</guid>
<description>Feel free to contact with me : [email protected]</description>
</item>
<item>
<title>Editor LifeCycle Methods in Unity [Unity Editor 生命周期函数]</title>
<link>https://yathenstianbase.github.io/posts/unity3d/editor-lifecycle-methods-in-unity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/editor-lifecycle-methods-in-unity/</guid>
<description>使用编辑器类可以自定义inspector和window的界面以及特有函数库;
需要使用 &ldquo;using UnityEditor;&ldquo;引入;
类文件需要放入名称为&quot;Editor&quot;的文件目录下,此目录可以在Assets目录下位置创建;
Edtior类包含的生命周期函数如下:
public static void OpenWindow() { EditorWindow.GetWindow&lt;DemoEditorWindow&gt;(); } private void OnEnable() { Debug.Log(&#34;当打开界面的时候调用&#34;); } private void OnInspectorUpdate() { Debug.Log(&#34;当属性界面更新时&#34;);//几乎一直在更新 } private void OnHierarchyChange() { Debug.Log(&#34;当场景层次界面发生改变时调用&#34;);//在Hierarchy界面改变(增加、减少物体) } private void OnProjectChange() { Debug.Log(&#34;当项目发生更改时调用&#34;);//在Project视图删除、增加文件 } private void OnGUI() { Debug.Log(&#34;当渲染UI的时候调用&#34;); } private void OnFocus() { Debug.Log(&#34;当被聚焦的时候调用&#34;); } private void OnSelectionChange() { Debug.Log(&#34;当选择发生更改时调用&#34;);//选中的可选项(在Project和Hierarchy视图中) } private void OnLostFocus() { Debug.Log(&#34;当失去焦点时调用&#34;); } private void OnDisable() { Debug.Log(&#34;当隐藏的时候调用&#34;); } private void OnDestroy() { Debug.</description>
</item>
<item>
<title>Euler And Quaternion in Unity3D [Euler And Quaternion in Unity3D 欧拉角与四元数]</title>
<link>https://yathenstianbase.github.io/posts/unity3d/eulerandquaternioninunity3d/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/eulerandquaternioninunity3d/</guid>
<description>Unity3d之欧拉角与四元数Link to heading&ndash;slerp 球形插值
在Unity中,如果需要更改物体的Rotation,并不能像更改Position一样直接对Vector赋值进行更改,因为Rotation是四元数的方式。
这时,可以对Rotation进行四元数的转换成欧拉角,做到赋值更改旋转轴数值。
四元数转欧拉角
Vector3 eulerAngles = transform.rotation.eulerAngles; 欧拉角转四元数:
Vector3 eulerAngles = new Vector3(0f, 30f, 0f); // 1 Quaternion rotation = Quaternion.Euler(rotationVector3); // 2 Quaternion rotation = Quaternion.Euler(eulerAngles.x, eulerAngles.y, eulerAngles.z); // 赋值 transform.rotation = rotation; 使用赋值欧拉角方式进行旋转
void Update() { // 直接赋值欧拉角,需要三个变量一起赋值 Vector3 currentEulerAngles += new Vector3(x, y, z) * Time.deltaTime * rotationSpeed; transform.eulerAngles = currentEulerAngles; } 使用四元数进行线性旋转
// void Update() { Turning(dir); } public void Turning(Vector3 dirVec) { if (dirVec !</description>
</item>
<item>
<title>FactoryMethod Pattern [工厂方法]</title>
<link>https://yathenstianbase.github.io/posts/designpattern/factorymethod-pattern/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/designpattern/factorymethod-pattern/</guid>
<description>工厂方法 设计模式 工厂方法属于构建类型的设计模式; 在最终调用时候,接受返回值的类型往往申明为一个接口类,也代表这种模式有公共的产品接口,可以通过不同的子类分别实现;
一般工厂方法包含如下部分:
Product [产品类,一般申明为公共接口类型] ConcreteProduct [具体产品类,继承Product的具体实现] Creator [工厂类,一般申明为抽象类,包含抽象的创建方法] ConcreteCreator [具体工厂类,继承Creator的具体实现] 例 Product 产品类
public interface IVehicle { void move(); } public interface IPhone { void dialog(); } ConcreteProduct 具体产品类
public class Car : IVehicle { public void move() { Debug.Log(&#34;Car -- move&#34;); } } public class Ship : IVehicle { public void move() { Debug.Log(&#34;Ship -- move&#34;); } } public class TelePhone : IPhone { public void dialog() { Debug.</description>
</item>
<item>
<title>FFmpeg Commands [FFmpeg命令]</title>
<link>https://yathenstianbase.github.io/posts/ffmpeg-commands/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/ffmpeg-commands/</guid>
<description>此工具可以在Github上找到源码:https://github.com/FFmpeg/FFmpeg
在ffmpeg官网可以下载Windows执行文件:https://ffmpeg.org/download.html
这里使用的版本是 ffmpeg-4.1-win64-static;
基本用法
ffmpeg -i input.mp4 //查看视频信息 ffmpeg -i input.mp4 output.avi //转换格式 视频转为Gif,更改后缀名即可;
ffmpeg -i input.mp4 output.gif 缩小分辨率(resolution), 参数 &ldquo;-s&rdquo;, 例如缩小为(240x160);
ffmpeg -i input.mp4 -s 240x160 output.avi 减少帧数,(对于Gif没什么用),参数 &ldquo;-r&rdquo; , 例如减少为(10帧);
ffmpeg -i input.mp4 -s 240x160 -r 10 output.avi 降低码率,(对于Gif没什么用),参数 &ldquo;-b&rdquo; , 例如设置为512K;
ffmpeg -i input.mp4 -s 240x160 -r 10 -b 512K output.avi 压缩命令
//直接压缩 ffmpeg.exe -i input.jpg out.jpg //指定目标大小压缩 ffmpeg.exe -i input.jpg -fs 25K out.jpg //一个拿色板的例子 ffmpeg.</description>
</item>
<item>
<title>Imgui for Unity [Unity版本Imgui]</title>
<link>https://yathenstianbase.github.io/posts/plugin/imgui-for-unity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/plugin/imgui-for-unity/</guid>
<description>安装方式
使用git url方式安装 原版: https://github.com/realgamessoftware/dear-imgui-unity.git 镜像: https://hub.nuaa.cf/realgamessoftware/dear-imgui-unity.git 硬盘: 拷贝其他项目下的缓存目录,package安装方式选择 &ldquo;Add pacakge from disk&rdquo;,选中缓存目录中的package.json文件 Unity2021版本之后可使用uimgui 使用方式
using ImGuiNET; // void OnEnable() { ImGuiUn.Layout += OnLayout; } void OnDisable() { ImGuiUn.Layout -= OnLayout; } void OnLayout() { ImGui.ShowDemoWindow(); // 展示Demo窗口 ImGui.Text($&#34;显示&#34;); // 测试文本 if (ImGui.Button(&#34;Save&#34;)) // 测试按钮 { Debug.Log(&#34;Save&#34;); } } Bug
CreateWindow(ImGuiWindowFlags.NavFlattened); 此方法的使用会导致unity2019.4奔溃; Ref:
Imgui的C#版本封装
基于Imgui的Uimgui,Unity2022版本之后可用
Imgui的Unity版本封装
Imgui的C版本封装</description>
</item>
<item>
<title>Implement Simple Object Pool in Unity [Unity3d中简单对象池的实现]</title>
<link>https://yathenstianbase.github.io/posts/unity3d/implement-simple-object-pool-in-unity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/implement-simple-object-pool-in-unity/</guid>
<description>对象池的作用在于避免频繁的进行对象的创建和销毁造成的资源浪费;
维护对象池也是需要资源的,为了限制其资源的占用,可以在创造一个对象池的时候,会限制其容量;
定义接口,规定对象池中必须要有的几个方法,子类以此实现;
interface IMonsterPool { GameObject Create(GameObject mon); GameObject Get(); void Recycle(GameObject mon); int CurrentCount(); void EmptyAll(); } 定义类,实现上述接口,考虑到要实行单例模式,而且并没有挂载的需要,因此不继承MonoBehaviour;
public class MonsterPool : IMonsterPool 定义容量的大小,当然可以从配置文件中来进行读取,并且使用了单例模式来获取对象池实例,这肯定不是唯一的办法,对象池的个数可以根据实际来调整,相应的取消单例模式即可; orignalMon为 初始的实例化对象,之后由对象池创建并管理的对象实际上都是此对象的克隆.可以在游戏开始加载时候从Assetbundle中来进行获取或直接Resource方法获取(不过此方法Unity官方似乎不推荐,可能有较大的资源性能等损耗);
#region protected int _Max = 50; protected int _Min = 0; protected int _DefCap = 5; private static List&lt;GameObject&gt; mons; private static MonsterPool _Instance; public static MonsterPool Instance { get { if (_Instance == null) { _Instance = new MonsterPool(); } return _Instance; } } private GameObject orignalMon; #endregion 构造方法创建对象的容器List,如果有多种不同的对象,也可以使用Dictionary;Init() 方法是传入的是初始对象,也可以说是模板^.</description>
</item>
<item>
<title>Light in Unity3D [Light in Unity3D 渲染管线]</title>
<link>https://yathenstianbase.github.io/posts/shader/lightinunity3d/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/shader/lightinunity3d/</guid>
<description>根据 Introduction to 3D Game Programming with DirectX 一书介绍,渲染流程大致分为以下几个步骤
Input Assembler (IA) stage [输入装配阶段]
此阶段将读取顶点和索引,并将这些数据组合成突击和图元;
Vertex Shader (VS) stage [顶点着色器阶段]
此阶段可以自定义编码,在Unity的shader格式中,&quot;#pragma vertex vert&quot;便是代表声明一个顶点着色器函数; v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; } Hull Shader (HS) stage
Tessellator stage
Domain Shader (DS) stage
Geometry Shader (GS)
Rasterizer (RS) stage
Pixel Shader (PS) stage [像素着色器阶段]
也称为片元着色器,属于可以自定义代码的阶段,处理每一个像素片段的颜色属性;在Unity中可以通过 &ldquo;#pragma fragment frag&quot;申明; half4 frag(v2f i) : COLOR { return _Color; } Output Merger (OM) stage</description>
</item>
<item>
<title>Lua Variables [Lua之变量]</title>
<link>https://yathenstianbase.github.io/posts/lua/lua-variables/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/lua/lua-variables/</guid>
<description>Lua为动态类型语言,变量不要类型定义,只需要为变量赋值;
基本类型
nil boolean number // 双精度类型的实浮点数; string // 字符串类型; function // 由 C 或 Lua 编写的函数; userdata // 与C语言的struct类似,可用于和C语言做交互; thread // lua提供的线程类,但是更接近协程; table // Lua 中的表(table)其实是一个&quot;关联数组&quot;(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过&quot;构造表达式&quot;来完成,最简单构造表达式是{},用来创建一个空表。 声明一个Lua变量,默认值为nil;
A= -- 不赋值,默认为nil print(A) -- 显示nil类型 print(type(A)) -- 显示nil类型 print(nil) -- 显示nil类型 print(type(nil)) -- 显示nil类型 声明boolean类型
T=true F=false print(type(T)) -- 显示boolean类型 print(type(F)) -- 显示boolean类型 if(not(nil)) then print(&#39;nil is false&#39;) -- 显示此行,nil在if表达式中相当于false else print(&#39;nil is true&#39;) end if(0) then print(&#39;0 is true&#39;) -- 显示此行,数字0在if表达式中相当于true else print(&#39;nil is false&#39;) end 声明number类型</description>
</item>
<item>
<title>Others</title>
<link>https://yathenstianbase.github.io/posts/others/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/others/</guid>
<description></description>
</item>
<item>
<title>Rendering Pipeline [渲染管线]</title>
<link>https://yathenstianbase.github.io/posts/renderingpipeline/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/renderingpipeline/</guid>
<description>根据 Introduction to 3D Game Programming with DirectX 一书介绍,渲染流程大致分为以下几个步骤
Input Assembler (IA) stage [输入装配阶段] 此阶段将读取顶点和索引,并将这些数据组合成突击和图元;
Vertex Shader (VS) stage [顶点着色器阶段] 此阶段可以自定义编码,在Unity的shader格式中,&quot;#pragma vertex vert&quot;便是代表声明一个顶点着色器函数;
例如:
v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; } Hull Shader (HS) stage
Tessellator stage
Domain Shader (DS) stage
Geometry Shader (GS)
Rasterizer (RS) stage
Pixel Shader (PS) stage [像素着色器阶段] 也称为片元着色器,属于可以自定义代码的阶段,处理每一个像素片段的颜色属性;在Unity中可以通过 &ldquo;#pragma fragment frag&quot;申明,
例如:
half4 frag(v2f i) : COLOR { return _Color; } Output Merger (OM) stage</description>
</item>
<item>
<title>RWBY</title>
<link>https://yathenstianbase.github.io/thinking/rwby/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/thinking/rwby/</guid>
<description>RWBY &ndash; 一部难忘的Anime
虽然距离第一次观看这部Anime已经是距离很长一段时间了,但是这部Anime的各方面给人的映像还是历历在目的。相信喜欢这部Anime的人,大多数都是首先被动作戏给惊艳到的,流畅和紧凑的动作编排,充满创意的武器设定,都会牢牢抓住人的眼球;
这段时间偶然关注到一位视频主,其聊到的话题大多数为游戏和影视的,其中也包含了&quot;动作性&quot;这一类的话题,还分析不少日式美式以及中式动作片中的特点,而提及RWBY时,称其中包含了以上种类的混合形式。的确,如果你喜欢但以前香港的功夫片,一定会在RWBY中找到相识的感觉,而你喜欢日式中的超能系以及任务画风,也能很明显感觉到,因为其画风就是日式,但是处处都有欧美风格的影子,比如说话方式和任务性格,整个片子的基调基本就是一种杂糅,但是糅的很好。
MONTY-OUM是这部Anime的作者,属于很全能的作者,如果你去观看其以前的作品,主要都是以动作为主,并且镜头和动作编排十分的有个人特色,其本人可以说是天才选手,至少在我这个外行人目前看来是这样;
从RWBY一开始的四部特色鲜明的预告片放出,如果找回之前发布现场的视频观看,当时的现场观众激动情绪可以说不亚于现在3A游戏发布会现场;在经历第一二季的放出,随着第三季预告放出,RWBY在小众圈子可以说声名鹊起。大概也是在那个时候,我看到了这部不可思议的作品,并留下了独一无二的印象。
当我带着不可思议的映像回顾这部Anime并了解到其作者时,同时也确确实实理解了一个词 &ndash; &ldquo;天妒英才&rdquo;。Monty没有完成这部作品,而留下的空白却没有人能够填补,可能有人愿意付出他那样的努力,但是可能其创作方式却独特到没人能效仿,在其后的季集中,RWBY似乎丧失了灵魂。
RWBY的前三季,难忘而又遗憾&hellip;</description>
</item>
<item>
<title>Shadow of the Tomb Raider UI Cap [古墓丽影UI截图]</title>
<link>https://yathenstianbase.github.io/posts/design/ui/shadow-of-the-tomb-raider-ui-cap/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/design/ui/shadow-of-the-tomb-raider-ui-cap/</guid>
<description> </description>
</item>
<item>
<title>Stencil [深度模板] 与 RayMarch[光线步进]</title>
<link>https://yathenstianbase.github.io/posts/stencilbuffer/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/stencilbuffer/</guid>
<description>光线步进Code:
Shader &#34;Unlit/RayMarchInWorld01&#34; { Properties { _MainTex (&#34;Texture&#34;, 2D) = &#34;white&#34; {} _CameraPos(&#34;CameraPos&#34;, vector) = (0.,3,0.) _CubeSize(&#34;CubeSize&#34;, vector) = (0.5,0.5,0.5,1) _CubePos(&#34;CubePos&#34;, vector) = (0,0.5,4,0) _CubeRotSpeed(&#34;CubeRotSpeed&#34;, float) = 0 _CubeScale(&#34;CubeScale&#34;, float) = 1 _CubeMirroOpt(&#34;CubeMirroOpt&#34;,vector) = (0,0,0,0) _CubeScaleOpt(&#34;CubeScaleOpt&#34;,vector) = (0,0,0,0) _CubeRotOpt(&#34;CubeRotOpt&#34;,vector) = (0,0,0,0) _DirectLightPos(&#34;DirectLightPos&#34;,vector) = (0,5,6) _MainColor(&#34;MainColor&#34;,Color) = (0.25, 0.65, 0.99,0.00) // stencil _StencilReferenceID(&#34;Stencil ID Reference&#34;, Float) = 1 [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp(&#34;Stencil Comparison&#34;, Float) = 3 [Enum(UnityEngine.Rendering.StencilOp)] _StencilOp(&#34;Stencil Operation&#34;, Float) = 0 _StencilWriteMask(&#34;Stencil Write Mask&#34;, Float) = 255 _StencilReadMask(&#34;Stencil Read Mask&#34;, Float) = 255 } SubShader { Tags { &#34;Queue&#34; = &#34;Geometry&#34; &#34;RenderType&#34; = &#34;StencilOpaque&#34; } Stencil { Ref[_StencilReferenceID] Comp[_StencilComp] Pass[_StencilOp] // keep ReadMask[_StencilReadMask] WriteMask[_StencilWriteMask] } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include &#34;UnityCG.</description>
</item>
<item>
<title>TemplateMethod Pattern [模板方法]</title>
<link>https://yathenstianbase.github.io/posts/designpattern/templatemethod-pattern/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/designpattern/templatemethod-pattern/</guid>
<description>模板方法 设计模式 利用面向对象编程语言的多态性,在抽象父类中定义共有的并且不会变化的方法,并可以通过组合方法来实现某种算法,之后利用在子类中实现方法这种&quot;延迟&quot;方式,来实现一种框架,多种实现方式的结构;
因为定义组合的方式是在抽象父类中,所以会给代码阅读带来一定的不便;
例 抽象模板
// 定义抽象类模板 abstract class TreeColorFlag { // 定义方法,但并不实现它们,利用面向对象语言的多态特性,留作子类来按照需要实现; protected abstract void DrawName(); protected abstract void DrawFirstPart(); protected abstract void DrawSecondPart(); protected abstract void DrawThirdPart(); // 将方法组织为某种算法 public void Draw() { DrawName(); DrawFirstPart(); DrawSecondPart(); DrawThirdPart(); } } 继承抽象模板类的子类
// 继承抽象模板类,实现父类方法; class ArmenianFlag : TreeColorFlag { protected override void DrawName() { Type type = typeof(ArmenianFlag); Debug.Log(type.Name+&#34;\n&#34;); } protected override void DrawFirstPart() { Console.BackgroundColor = ConsoleColor.Red; Debug.Log(new string(&#39;-&#39;, 15)); } protected override void DrawSecondPart() { Console.</description>
</item>
<item>
<title>Time Control In Unity</title>
<link>https://yathenstianbase.github.io/posts/unity3d/time-control-in-unity/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/time-control-in-unity/</guid>
<description>Unity在C#脚本和Shader脚本中都提供了时间类;
Unity 提供的时间变量有:
Time.time Time.deltaTime &ndash; Update()函数中的时间分片,不是固定值; Time.fixedDeltaTime &ndash; FixUpdate()函数中的时间分片,为固定值; Time.timeScale &ndash; 用于确定游戏程序中时间流逝速度;可以利用此变量实现暂停或者加速效果; 搭配Mathf.Lerp()函数使用,可以实现平滑时间过度效果; // 实现类似superhot的时间平缓效果; public bool action; float x = Input.GetAxisRaw(&#34;Horizontal&#34;); float y = Input.GetAxisRaw(&#34;Vertical&#34;); float time = (x != 0 || y != 0) ? 1f : .03f; float lerpTime = (x != 0 || y != 0) ? .05f : .5f; time = action ? 1 : time; lerpTime = action ? .1f : lerpTime; Time.</description>
</item>
<item>
<title>Unity Coroutine [Unity Coroutine 协程]</title>
<link>https://yathenstianbase.github.io/posts/unity3d/unity-coroutine/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity3d/unity-coroutine/</guid>
<description> Coroutine协程是Unity提供的一种在主线程中处理额外任务的方式;
协程并不是多线程,而是利用迭代器进行帧或者时间切片控制,它可以决定每次经过多少切片时间后将游戏的逻辑控制交给主线程;
在Unity的Monobehavior生命周期中,有一个被称为&quot;game logic&quot;的部分,其中包含&quot;yield StarCoroutine&quot;等操作,是属于处理协程的运算逻辑的部分;
Monobehavior生命周期中,依次经过 Star -&gt; yield WaitForFixedUpdate -&gt; Update -&gt; LateUpdate,以下代码使用Unity逐帧运行功能可以初步简单验证:
private void Start() { StartCoroutine(CoUpdate()); } public IEnumerator CoUpdate() { Debug.Log(&#34;before loop CoUpdate&#34;); while (true) { Debug.Log(&#34;before CoUpdate&#34;); yield return new WaitForFixedUpdate(); // 在FixedUpdate处理后 Debug.Log(&#34;after CoUpdate&#34;); } } private void Update() { Debug.Log(&#34;update&#34;); } private void LateUpdate() { Debug.Log(&#34;lateupdate&#34;); } 先点暂停然后启动,逐帧运行一次,打印结果为: 协程的一种暂停方式:
while(!some_condition) { yield return null; } </description>
</item>
<item>
<title>Unity plugin - A Pathfinding Project Pro [Unity A*寻路插件]</title>
<link>https://yathenstianbase.github.io/posts/plugin/a-pathfinding-project-pro/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/plugin/a-pathfinding-project-pro/</guid>
<description>相关插件 A* pathfinding project pro
实现在Unity上的AStarPathfinding寻路的插件,提供了高级的寻路AI系统;
新建空物体命名为&quot;A*&quot;,并添加pathfinder组件脚本; 添加Graph,选择第一种类型Grid Graph; )
Shap &ndash; 寻路网格类型
width 和 depth &ndash; 表示寻路网格面积区域;
Node size &ndash; 单个寻路网格单位尺寸
Height testing
ray length &ndash; 从上自下的发射检测射线,以此来确定此网格单位表面是否可寻址区域; 通过移动来对比出经过射线检测后寻路网格区域: Collision Testing
Obstacle Layer Mask &ndash; 添加障碍物层,属于此层的物体将不会在其表面生成寻路网格: 添加寻路AI,可以从示例场景中拷贝bot对象; </description>
</item>
<item>
<title>Unity Scriptable Render Pipeline [Unity可编程渲染管线]</title>
<link>https://yathenstianbase.github.io/posts/unityscriptablerenderingpipeline/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unityscriptablerenderingpipeline/</guid>
<description>Scriptable Render PipelineLink to headingUnity中SRP管线简化代码构成;
定义SRP资源文件, 对象包含关系为 RenderPipelineAsset -&gt; RenderPipeline -&gt; CRenderer;
CSRPA.cs 定义SRP资源类
[CreateAssetMenu(menuName = &#34;CSRPA&#34;)] public class CSRPA : RenderPipelineAsset { public bool isUseSRPBatching; protected override RenderPipeline CreatePipeline() { return new CSRP(isUseSRPBatching); } } CSRP.cs 定义渲染管线类
internal class CSRP : RenderPipeline { CRenderer crenderer = new CRenderer(); private bool isUseSRPBatching; public CSRP(bool isUseSRPBatching) { this.isUseSRPBatching = isUseSRPBatching; GraphicsSettings.useScriptableRenderPipelineBatching = isUseSRPBatching; } protected override void Render(ScriptableRenderContext context, Camera[] cameras) { foreach (Camera cam in cameras) { crenderer.</description>
</item>
<item>
<title>Unity shader params [Unity shader 内置参数]</title>
<link>https://yathenstianbase.github.io/posts/unity-shader-buildin-params/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/posts/unity-shader-buildin-params/</guid>
<description>不同的光照模型对应不同结构体参数: Diffuse -&gt; SurfaceOutput StandardSpecular -&gt; SurfaceOutputStandardSpecular 结构体中包含的属性: Albedo -&gt; 颜色 Normal -&gt; 切线空间法线 Emission -&gt; 材质发光属性 Alpha -&gt; 透明度 specular -&gt; 高光 Gloss -&gt; 高光强度 Occlusion -&gt; 遮蔽光 Smoothness -&gt; 光滑度 Metallic -&gt; 金属特性 Tag参数: Queue -&gt; 渲染队列(unity默认提供),它们包含如下选项: Background Geometry AlphaTest Transparent[实现玻璃之类] Overlay 将对应的值写入即可; IgnoreProjector -&gt; 布尔值,是否忽略投影; RenderType -&gt; ? TRANSFORM_TEX unity内置宏,自动进行uv偏移和缩放操作; unity_WorldToObject 是一个矩阵,从物体坐标系转化到世界坐标系需要和此矩阵相乘(非等比模型略有不同); UnityObjectToClipPos 获取物体position; appdata_base 一般常用作数据来源(appdata_full默认内置) v.vertex 获取顶点数据 v.normal 获取顶点法向量 inout 关键字 #pragma 关键字 surface surf Lambert -&gt; surf函数使用SurfaceOutput作为参数; surface surf Standard -&gt; surf函数使用SurfaceOutput作为参数; nolightmap -&gt; 不使用关照贴图; alpha:fade -&gt; 处理transparent效果时候使用; alpha:fade -&gt; 表示根据material中的alpha值对之前渲染像素进行blend,如玻璃的会显示它后面的东西(和zbuffer以及queueu顺序有关) fullforwardshadows -&gt; vertex:vert -&gt; 指示unity寻找一个名为vert()函数执行 tex2D(from, to) UnpackNormal 一般用于获取bumpmap的法向量 saturate() pow() 函数 tex2Dlod() float4(v.</description>
</item>
<item>
<title>书籍阅读</title>
<link>https://yathenstianbase.github.io/projects/books-reading/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://yathenstianbase.github.io/projects/books-reading/</guid>
<description> 编程语言
C++ Primer Plu, [C++作为老牌语言,值得了解]; C# programming guide, [微软推出的面向对象编程语言]; 图形
Unity 5.x Shaders and Effects Cookbook(2nd), [虽然是基于Unity5老旧版本的入门基础讲解,但是很符合工具书属性,基本上每个知识点都会从&quot;准备&quot;,&ldquo;如何做&rdquo;,&ldquo;工作原理&rdquo;,“扩展”等步骤来进行讲解]; Introduction to 3D Game Programming with DirectX12, [中文版为&quot;DX11龙书中译&quot;,排版甚至优于英文原版]; 设计模式
Game Programming Patterns, 由 Electronic Arts 工程师编写; Unity3D引擎
Catlike Coding, [一位荷兰开发者&rsquo;Jasper Flick&rsquo;的个人技术博客,介绍了相当多Unity的技术以及Demo的展示]; 其他
The Art and Rendering of Remember Me, [GDC上游戏&quot;Remember Me&quot;的渲染技术介绍]; James Gurney-Color and Light | 詹姆斯·格尔尼《色彩与光线》, [了解色彩] 动画师生存手册, [了解传统动画]; </description>
</item>
</channel>
</rss>