Posts

Showing posts from August, 2021

Godot 基本和进阶语法注意事项(长期更新)

多重继承 Godot 目前不支持多重继承。如果你有一个entity类继承自node,然后你有一个plant类,既要继承entity,又要有Sprite类的功能,这是不行的,只能通过增加child node,或使用singleton来实现。 Add a GDScript Trait system. · Issue #23101 · godotengine/godot (github.com) Inner Class 类的逻辑分组:如果一个类只对另一个类作用,那么将它嵌入那个另一个类并将两者保持在一起是合乎逻辑的,嵌套这样的"帮助类"使得它们的包更加简化。 内部类extend可以和外部类不一致,如外部extends Spatial, 内部extends Sprite godot中内部类不可访问外部类成员变量,这会造成cyclic dependence循环引用,可能在4.0会得到更好的解决 想要继承内部类, extends "somefile.gd".SomeInnerClass 不使用extends时,内部类是默认继承reference的,自带内存管理 类的初始化Init 如果覆写了_init()函数,则可以在new()时传入参数并初始化 extends Node2D func _ready(): var p = Creature.new("eagle") print (p.name) var q = Creature.new() print(q.name) class Creature extends Resource: var name = "" func _init(_name = "creature"): name = _name 带有参数的_init()在绑定到scene时,使用instance()不可以传入参数(_init参数需要默认值,否则可能报错),packedscene也没有new()函数 如果使用继承,则子类默认以空参数先执行父类_init() 继承和函数重写override 内置函数如_process(delta), _physics_process(delta),会自动调用继承父级的同名函数,顺序是先调用子级,再调用父...

Godot 场景树及常见调用顺序

Godot场景树func调用顺序 -Root     -Child1          -GrandChild1     -Child2  后面接的数字代表当时子节点数 init时不能获取name    init0  init0  init0  init0   Root enter tree!2 Child1 enter tree!1 GrandChild1 enter tree!0 Child2 enter tree!0 GrandChild1 ready!0 Child1 ready!1 Child2 ready!0 Root ready!2 Child2 exit tree!0 GrandChild1 exit tree!0 Child1 exit tree!1 Root exit tree!2 可以看到-enter tree 自上往下,并且必须子节点全部enter tree后才能继续下一个节点,exit tree顺序相反。ready则是最上面的最子节点先完成,然后是父节点。只有一个node的所有子节点全部ready后,父节点ready,然后才会向下继续。 _ready函数 _ready()函数只在节点第一次添加入树内触发,如果想在节点移除再添加后仍旧触发_ready(),请手动调用request_ready(),注意,该方法不会立即被调用,但会在节点再次添加到场景树时自动触发ready的调用 onready在_ready前,onready的节点进入树内时调用 使用tool关键字后,节点在创建时调用(后面切换scenetab不再调用) _enter_tree函数 进入树内时调用 使用tool关键字后,切换scenetab时调用 添加子节点 添加子节点无需父节点在树中,但是被添加的节点_enter_tree不会执行,只有父节点进入树内后,enter_tree,ready等才会依次开始执行 从场景树移除节点 使用remove_child(node)移除节点,注意此时节点并未删除,只是不在场景树内,相关函数如process不会得到执行。你可以再次使用add_child(node)将节点还原回场景树。 同一个n...

Godot 获取editor camera的hack方法

Godot中想要自己制作editor plugin的话,可能你需要获取编辑器相机参数,现在API并未提供接口,所以只能用比较hack的方式获取。代码如下 func get_editor_camera(camera_index):#get camera in the spatial editor(4 camera in spatial editor) var e = get_editor_interface().get_editor_viewport() var cam = e.get_child(1).get_child(1).get_child(3).get_child(0).get_child(cam_index).get_child(0).get_child(0).get_camera() # If the function not work, use code below to check(new version godot change the camera hierarchy) var root = e.get_parent() var all_nodes = [] var c = root.get_children() while !c.empty(): var child_list = []                         for i in c: child_list += i.get_children() all_nodes += child_list c = child_list for node in all_nodes: if node.get_class() == "Camera": print(node.transform) print(node.get_path()) for i in range(deep): node = node.get_parent() print(node.get_class() + str(node.get_index())) print("...

Some Pixel animation

Image
 

Godot常见错误(长期更新)

打印basis和打印basis.xyz不一致 注意打印basis是按行输出matrix的,而正常获取basis.xyz元素应该是按列         [a b c]  Basis = [d e f], Basis.X = [a, d, g]         [g h i] 屏幕空间投射仅在距离为cam  far出问题(大于小于都正常) Camera.project_position() always give wrong results when z_depth is Camera.far var pos_near = Cam.project_position(mouse_pos, Cam.near) var pos_far = Cam.project_position(mouse_pos, Cam.far - 1) get_node()返回null时,编辑器抛出异常。正确方式是使用get_node_or_null() 编辑器中使用remove_and_skip()可能造成闪退 Custom Class获取类名不一致 使用get_class()获取自定义类(使用class_name定义的类)只能获取其父类名。如 #npc.gd extends Sprite class_name NPC 此时获取npc_node.get_class()返回的是"Sprite"而不是"NPC",想要判断的话可以使用is关键字 node is NPC而要获取到正确类名的话要手动覆写get_class类 get_class():     return"NPC" get_class() and is_class() not returning class_name · Issue #21789 · godotengine/godot (github.com) 空项目出现单帧尖峰(未解决,可能是引起stutter卡顿的直接原因) Single frame spikes even in an empty project · Issue #33969 · godotengine/godot (github.com) Enabling verbose output makes `a...

How to make editor plugin in godot

Image
锁定node编辑状态 node.set_meta("_edit_lock_", true)   node.set_meta("_edit_lock_", null)      spatial Gizmo plugin Final result: 获取当前编辑场景的文件路径 get_tree().edited_scene_root.filename

Flash & Adobe Animation CC tips

画笔类工具有object和非object两种模式。前者绘制线条都是单独一根,故而看起来是包围图形也不能填充,因为它们是各自独立的。左边的propertie可以显示一个物体是什么 使用ctrl+g使分散的物体成为组group,ctrl+b将他们break apart打散。drawing object(即直接绘制的形状)也是一种特殊的组。注意只有通过ctrl+g分组后才能arrange各object的深度,原生的drawing object是不能变换深度的。 使用Q来进行自由缩放 使用F8来将一个物体做成symbol。symbol有三种模式-movieclip, graphic和button。 F5添加关键帧,F6复上一个图层可以作为下一个图层的形状遮罩mask,可以用来上渐变色或其他用途制并新建一个关键帧,shift+F6删除关键帧。F7创建空白帧。 IK骨骼建立后会单独生成骨骼图层。注意之前要将各个部分分别symbol化。在骨骼动画中不使用keyframe,代替之的是pose。 IK骨骼可以通过Q自由变换并移动部件本身或是部件的中心点来进行调整。 生成透明gif的效果一般不好,可以通过导出movie中选择png32位来导出序列帧 Preference中可以设置洋葱皮的颜色,但不能设置透明度。 上一个图层可以作为下一个图层的形状遮罩mask,可以用来上渐变色或其他用途(图层右键-mask) 色板swatches 层级:folder-swatches-color 文件夹有default swatches(不建议将颜色放进这里,很难找到),tagged swatches(相当于ai中的全局色,可以同时更改所有用此颜色的物体)和自定义文件夹。palette调色板存放在folder中,swatches色块存放在palette中。自定义文件夹中的调色板和色块可以互相拖动来移动位置 色板操作有5个,在面板的右下角。 1.convert to tagged swatches 转化为标签颜色--点击相应颜色后可转化为tagged swatches。 2.create new empty folder 创建新的色板文件夹 3.create new palette 在文件夹中创建新调色板 4.create new swatch在调色板中创建颜色,选择相应的palette后点击添加即可将色...

建模术语中英文对照表

vertex edge face  attenuation 衰减(如光照) 描边 stroke 填充 fill 旋转 rotate 缩放 scale pan

怎样描述一个产品?

 产品特征元素:配色,线条,块面,过渡,节奏,表面处理,材料,味道,触感,声音,整体造型,感觉 对造型特征描述的词语:犀利,动感(dynamic),流畅,干练,锋利,圆润,简洁,力量感,速度感,张力,肌肉感,纤细,厚重,饱满,敦实

Godot 学习笔记(1)

  From Gamemaker to Godot Godot中Scene和gamemaker中的object有点类似,但GM中的object几乎是全能的,它可以执行任何你想要的,而在godot中开发者将功能更加细化为了节点,你可以选择特定的一组节点来完成相应的功能。   GDscript 语法 使用缩进来表示层级关系 if判断逻辑后要加冒号 [cc lang="c#"] func _unhandled_input(event): if event.pressed and event.scancode == KEY_ESCAPE: get_tree().quit() [/cc]

奇特动物收录

 枪虾-猎食时会将巨螯迅速合上,喷射出一道时速高达100km/h的水流,将猎物(如 小鱼 、小虾、小螃蟹等)击晕甚至杀死。

Taskticker 0.1 demo released!

 Task Ticker是用godot开发的一款任务管理工具, 可以创建具有层级的任务树来管理你的项目。 迷你番茄模式可以使你保持专注, 并记录你的工作状态和任务时长。 后期将加入更多丰富功能入内置音乐播放器和时间提醒等。 戳这里下载并查看详细信息:

麦克风几种防风设备的比较

Image
 先说结论--防风性能 海绵式<短毛<长毛 <腔体式----即腔体越大防风效果越好。同样高频损失大小也是海绵式<短毛<长毛 <腔体式,防风越好,高频损失越大,当然可以通过一定的后期来降低这个负面效果。 最容易被忽视的视频配件是麦克风的户外挡风玻璃。视频工作人员的大部分工作都在户外进行,随机风噪声是最难控制的异常之一。这意味着一些在极端环境中工作的音响操作员在防风设备上花费的钱与麦克风本身一样多。 在室内捕捉专业音频比在室外更难。从表面上看,在户外录制良好声音的能力被认为是专业音响操作员的顶级技能之一。它不仅需要有关如何管理风噪声的具体知识,还需要合适的工具来完成这项工作。顺便说一下,这些工具可能会变得昂贵。 有点混乱的是挡风玻璃和流行过滤器之间的区别。 高端麦克风制造商 Neumann 表示,防风罩的主要目的是保护麦克风极头免受风吹。正如预期的那样,挡风玻璃主要用于户外现场录音。 然而,挡风玻璃也可以用来防止“砰砰”声,当某些语音(例如 Ps 和 Bs)近距离撞击麦克风膜时,会在录音棚内发生这种噪音。这些语音也称为“爆破音”,因为它们是通过释放少量空气而产生的。Neumann 说,流行屏幕就是为这个问题设计的,尽管一些用户错误地使用了挡风玻璃。这不是挡风玻璃的设计目的。 Rycote Stereo Cyclone DMS(双中侧) 无论何时在户外工作 - 无论条件如何 - 使用挡风玻璃以减少风影响麦克风极头的机会。没有好的方法可以消除录音中不需要的风噪声。在极端情况下,由于长时间暴露在风中,也可能损坏麦克风的极头。 对于室外风,许多因素都会起作用。这些可能包括环境条件,例如与正在使用的麦克风类型及其特性相比的气流性质。由于室外条件不可预测,专业音响操作员随时准备应对各种情况。没有人想听到风太大而无法捕捉到清晰的音频。 飞艇挡风玻璃上的猎枪 户外使用的麦克风包括霰弹枪,它们的方向性很强,会受到风噪声的影响。它们还包括领夹式话筒(主要是全指向性)和手持话筒(主要也是全向性)。全向话筒对风噪声的敏感度不如定向话筒,但仍需要防风。 麦克风的防风措施分为三种基本类型,包括泡沫防风罩、风向袋或防风罩和飞艇。每个都有防止风噪声破坏音频的作用。 视频工作人员的麦克风制造商 Azden 将风噪声描述为在视频的音轨中听起来像重低音、...

Mini Sketchbook Collection #2

Image
 

Mini Sketchbook Collection #1

Image