单例:
可以在任意脚本直接访问的对象,分为内置和自定义;
不是节点,可以直接使用控制图形和音效;
例:Input,对玩家按键情况进行反馈
Input.get_action_strength(”自定义按键“)//按下为true,没按为0
在某一节点可以使用self指定其本身,position代表其位置.x和 .y可以访问坐标
在pong中使用到的函数
func _physics_process(delta: float) -> void:
#随每个物理帧刷新一次,
get_overlapping_areas()
返回相交的 Area2D 的列表,可以用for访问
for i in get_overlapping_areas():
if i.is_in_group("Ball"):
i.vec.x=5
● bool is_in_group(group: StringName)
判断节点是否在这个组里(node,例子如上
Input.get_action_strength(action: StringName, exact_match: bool = false)
返回一个介于 0 和 1 之间的值,表示给定动作的强度。前者为在项目中设置的键位映射
Input为内置类,检测玩家输入输出
var y1=Input.get_action_strength("玩家1上")*5
String num_int64(number: int, base: int = 10, capitalize_hex: bool = false)
将给定的数字 number 转换为字符串表示,进位制由 base 给定。
默认情况下 base 为十进制(10)。编程中常见的进位制还有二进制(2)、八进制 (8)、十六进制(16)。
如果 capitalize_hex 为 true,比 9 大的数位会大写。
是String内置类下的函数
text="score_two:"+String.num_int64(NewScript.score1)
后续学习
Node get_node(path: NodePath)
获取一个节点。NodePath 可以是到一个节点的相对路径(从该节点开始)或绝对路径(从 SceneTree.root 开始)。
var a=get_node("sound")#sound为子节点名字
#等效于:get_node("sound").play();等效于$sound.play
Node get_child(idx: int, include_internal: bool = false)
通过索引获取子节点。每个子节点都有一个相对于其同级节点的索引(请参阅 get_index())。第一个子节点位于索引 0 处。负值也可用于从列表末尾开始。该方法可以与 get_child_count() 结合使用来迭代该节点的子节点。如果给定索引处不存在子节点,则该方法返回 null 并生成一个错误。
如果 include_internal 为 false,则忽略内部子节点(请参阅 add_child() 的 internal 参数)。
get_child(2).play()#直接调用,其余形式同上(get_node)
Node get_parent()
返回该节点的父节点,如果该节点没有父节点,则返回 null。
使用get_node("..")也可以获取父节点,操作如下
┖╴root
┠╴Character(你在这里!)
┃ ┠╴Sword
┃ ┖╴Backpack
┃ ┖╴Dagger
┠╴MyGame
┖╴Swamp
┠╴Alligator
┠╴Mosquito
┖╴Goblin
使用”/“获取多级子节点
get_node("Sword")
get_node("Backpack/Dagger")
get_node("../Swamp/Alligator")#从当前节点的父节点搜索
get_node("/root/MyGame")#直接从全局根节点搜索
Array[Node] get_children(include_internal: bool = false)
返回该节点的所有子节点到一个 Array 内。即只能返回直接相连的子节点,多级不返回
如果 include_internal 为 false,则从返回的数组中排除内部子节点(见 add_child() 的 internal 参数)。
信号的连接与发射
Error connect(signal: StringName, callable: Callable, flags: int = 0)
按名称将 signal 连接到 callable。还可以添加可选的 flags 来配置该连接的行为(请参阅 ConnectFlags 常量)。
一个信号只能连接到同一个 Callable 一次。
signal abc
func _ready() -> void:
self.connect("abc",Callable(self,"a"))
func a(b):
print(b)
void disconnect(signal: StringName, callable: Callable)
按名称从给定的 callable 断开 signal。如果连接不存在,则生成一个错误。
bool is_connected(signal: StringName, callable: Callable) const
如果给定的信号名称 signal 与可调用体 callable 之间存在连接,则返回 true。
Error emit_signal(signal: StringName, ...)
按名称发出给定的 signal。该信号必须存在,所以它应该是该类或其继承类之一的内置信号,或者是用户定义的信号(参见 add_user_signal())。该方法支持可变数量的参数,所以参数可以以逗号分隔的列表形式传递。
signal abc
func _ready() -> void:
self.connect("abc",Callable(self,"a"))
emit_signal("abc",12)#信号若要发出,需要有对应与其链接的函数参数,否则无效
func a(b):
print(b)
SceneTreeTimer create_timer(time_sec: float, process_always: bool = true, process_in_physics: bool = false, ignore_time_scale: bool = false)
返回一个新的 SceneTreeTimer。在以秒为单位的 time_sec 过去后,该计时器将发出 SceneTreeTimer.timeout 并自动释放。
var time=get_tree().create_timer(3)
await time.timeout
#或者省略中间变量,不能省略timeout
await get_tree().create_timer(3).timeout
#get_tree()也是必要的,接收creat.timer()
一个对象内部的信号只属于这个对象,另一个对象b的同名信号在发射后无法触发a所绑定的方法
类,继承
在一个脚本中定义的变量另一份脚本无法直接访问,可以使用继承方式获取;
var a#在a中的变量
extends "res://new_script.gd"#父类路径,即a的路径
func _ready() -> void:
a=10
同时可以使用类进行继承;
class_name ha#在a中开头定义类
extends ha#b中继承类
func _ready() -> void:
a=10
super关键字
调用父节点的函数
super.method()#优先访问父节点同名函数,必须写在某个函数中
在子类中的函数调用父类同名函数;
func _ready() -> void:
_mysuper()
func _mysuper():
super()#或者super._mysuper()
print("brother")
object
记录object的变量都是引用变量?
void _init() virtual
实例化对象的脚本时调用,通常是在对象在内存中初始化之后(通过 GDScript 中的 Object.new() 或 C# 中的 new GodotObject)。也可以将其定义为接受参数的形式。该方法类似于大多数编程语言中的构造函数。
void _enter_tree() virtual
当节点进入 SceneTree 时调用(例如实例化时、场景改变时或者在脚本中调用 add_child() 后)。如果节点有子节点,则首先调用它的 _enter_tree() 回调函数,然后再调用子节点的回调函数。
func _init() -> void:
print("okinit")
func _enter_tree() -> void:
print("yestree")
void _notification(what: int) virtual
当对象收到通知时被调用,可以通过将 what 与常量比较来识别通知。
基类 Object 定义了一些通知(NOTIFICATION_POSTINITIALIZE 和 NOTIFICATION_PREDELETE)。Node 等继承类定义了更多通知,这些通知也由该方法接收。
#NOTIFICATION_POSTINITIALIZE = 0
该对象初始化时收到的通知,发生在附加脚本之前。内部使用。
# NOTIFICATION_PREDELETE = 1
该对象即将被删除时收到的通知。可以用作其他面向对象编程语言中的析构函数。
# NOTIFICATION_EXTENSION_RELOADED = 2
当对象完成热重加载时收到的通知。该通知仅针对扩展类和派生类发送。
func _ready() -> void:
free()#调用即清除,what变1,输出;
func _notification(what: int) -> void:
if(what==1):
print("再见")
● void free()
在节点中,不推荐使用
#从内存中删除该对象。对该对象的预先存在的引用会变得无效,并且任何访问它们的尝试都将会产生一个运行时错误。
void queue_free()
在空闲帧清除节点
将该节点加入队列以在当前帧末尾删除。被删除时,其所有子节点也将被删除,并且对该节点及其子节点的所有引用都将变得无效。
与 Object.free() 不同,该节点不会被立即删除,并且它在被删除前仍然可以访问。多次调用 queue_free() 也是安全的。
void set_script(script: Variant)
将脚本 script 附加至该对象,并进行实例化。因此会调用该脚本的 _init()。Script 可用于扩展对象的功能。
如果已存在脚本,则该脚本的实例会被分离,其属性值和状态会丢失。仍会保留内置属性的值
func _ready() -> void:
var src=load("res://新脚本.gd")
$Node.set_script(src)#附加
$Node.a()#附加之后可以调用脚本中的函数
Resource load(path: String, type_hint: String = "", cache_mode: CacheMode = 1)
在给定的 path 中加载资源,并将结果缓存以供进一步访问。
RefCounted
引例
可以使用
类名.new();创建一个新的Refcounted对象
load("路径“).new();同上
load中也可放入变量代替路径
preload在脚本资源生成时就进行preload的加载,这时候变量未出现,只能以文本字符串的形式告知preload加载的内容,其余同load
class_name person
extends RefCounted
var name:String=""
var age:int=0
func _init(p_name):#创建时的构造函数,需要加参数
name=p_name
print(name,"出生了")
func one_year_past():
self.age+=1
func _notification(what: int) -> void:
if(what==1):
print(name,"死了")
print("终年",age , "岁")
以上是一个类代码;已经定义为全局
extends Node
var person1
func _ready() -> void:
person1=person.new("李老四")#直接调用构造,_init函数,
var person2=load("res://新脚本.gd").new("王二");使用路径构造
person2.one_year_past()
#当_ready函数运行结束,person2回收,触发notifaction
Variant new(...) vararg
返回该脚本的一个新实例化对象。
RefCounted特征:
1:内置引用计数器,即每有一个对象创建+1,销毁-1;归0自动删除
2.不包含内置属性,轻量
另一份
ProjectSettings
可以在类中创建全局变量
场景的实例化(加载
一个场景资源调用instantiate,将生成对应节点集合,并将这些节点的根节点作为返回值返回
使一个处于场景树下的节点运行add_child();并将新生成的根节点作为add_child参数调用,则根节点就会成为这个节点的字节点,新生成的节点也将全部加到树下
func _ready()
var scene=load("路径")#加载路径
var root=scene.instantiate()#创建实例,会返回该场景的根节点
self.add_child(root)#加入节点。即加入场景树
在实例化前即 _init()未执行时,节点间处于独立,无法通过get_node()获取子节点
在函数外部使用@onready关键字,可将变量赋值拖延到ready执行的时刻

1258

被折叠的 条评论
为什么被折叠?



