godot基础

godot基础
凝雨语法
变量
1 | var 变量:int #自动转换类型 |
类
1 | class 类: |
函数
1 | func 方法()->void: |
1 | #判断类型转换掉用 |
封装
1 | var _width: float = 0.0 |
存储系统
代码实例:读取
1
2
3
4
5
6
7
8
9extends Node
class_name 存储类
func 读取数据(path:String):
var file:FileAccess=FileAccess.open(path,FileAccess.READ)
var text=file.get_as_text()
var json_text=JSON.parse_string(text)
return json_text
pass代码示例:存储
1
2
3
4
5func 存储数据(conn,path:String):
var file:FileAccess=FileAccess.open(path,FileAccess.WRITE)
var json_conn=JSON.stringify(conn)
file.store_string(json_conn)
pass延时代码 gds
在Godot引擎中,除了
call_deferred()方法外,还有一些其他类似的方法可以用来控制函数的执行时机。这些方法提供了不同的调度和延迟机制,以便开发者能够根据具体需求调整代码的执行顺序。以下是一些与call_deferred()类似的方法:1.
yield()和协程在GDScript中,你可以使用
yield()来创建协程(coroutines),它允许你编写非阻塞的、分步执行的代码。通过yield(),你可以暂停函数的执行,直到某个条件满足或某个事件发生时再继续执行。这对于需要等待某些操作完成或满足某些条件的情况非常有用。示例
1
2
3
4
5
6func delayed_action():
# ... 一些初始操作 ...
yield(get_tree().create_timer(1.0), "timeout") # 等待1秒
# ... 延迟执行的代码 ...2. 使用
Timer节点Timer节点是Godot中用于定时执行操作的内置节点。你可以设置Timer的等待时间,并在时间到达时连接到一个函数或信号。这种方法通常用于需要定时重复执行或单次执行的操作。示例
1
2
3
4
5
6
7
8
9
10
11
12
13extends Node
onready var timer = preload("res://path_to_timer_scene.tscn").instance()
func _ready():
add_child(timer)
timer.connect("timeout", self, "_on_timer_timeout")
timer.wait_time = 1.0 # 设置等待时间为1秒
timer.one_shot = true # 设置为单次触发
timer.start() # 启动计时器
func _on_timer_timeout():
# ... 定时器超时时执行的代码 ...3. 使用
Tween节点Tween节点允许你创建平滑的动画过渡效果,也可以用来延迟执行某些操作。通过Tween,你可以指定一个节点的属性值随时间变化的过程。虽然它主要用于动画,但也可以用于延迟或调整属性的变化。示例
1
2
3
4
5
6
7
8
9
10
11extends Node2D
onready var tween = $Tween # 假设你有一个Tween节点作为子节点
func _ready():
tween.interpolate_property(self, "position", Vector2(100, 100), 1.0) # 在1秒内移动到(100, 100)
tween.start()
yield(tween, "tween_completed") # 等待动画完成
# ... 动画完成后执行的代码 ...4. 在
_process或_physics_process中使用时间检查如果你只是想在特定的时间后执行某个操作,你可以在
_process或_physics_process函数中使用当前时间与目标时间的比较来实现延迟。这适用于那些不需要精确时间控制的简单延迟需求。示例
1
2
3
4
5
6
7
8
9
10
11
12extends Node
var delay_time = 1.0 # 延迟时间(秒)
var start_time = 0.0 # 开始时间
func _ready():
start_time = OS.get_ticks_msec() / 1000.0 # 获取当前时间(秒)
func _process(delta):
if OS.get_ticks_msec() / 1000.0 - start_time >= delay_time:
# ... 延迟执行的代码 ...
start_time = -1.0 # 重置开始时间,防止重复执行这些方法提供了不同的延迟和调度机制,你可以根据具体的应用场景和需求选择最适合的方法。需要注意的是,每种方法都有其适用的场景和限制,因此在使用时应该仔细考虑其适用性和可能的影响。
玩家系统
第三人称相机控制
- 相机创建一个Node3D为相机Camera3D的父节点,然后创建一个相机
1 | extends Node3D |
- 玩家脚本:
1 | extends CharacterBody3D@onready var 相机根:=$camercont |
- 副本
1 | extends CharacterBody3D |
- 简单旋转朝向
1 | //1. |
1 | extends CharacterBody3D |
装配系统
所需节点Node3D,Marker3D作为部件放置的位置,方便调整位置
@tool extends Node3D class_name 装备模型 @onready var 枪身: Marker3D = $"枪身" @onready var 枪管: Marker3D = $"枪管" @onready var 瞄准仪: Marker3D = $"瞄准仪" #资源,每当资源变更时刷新配件节点 @export var 枪身资源:武器资源类: get: return 枪身资源 set(value): if value==枪身资源: return 枪身资源=value 武器资源更新() @export var 枪管资源:武器资源类: get: return 枪管资源 set(value): if value==枪管资源: return 枪管资源=value 武器资源更新() @export var 瞄准仪资源:武器资源类: get: return 瞄准仪资源 set(value): if value==瞄准仪资源: return 瞄准仪资源=value 武器资源更新() # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass func 武器资源更新(): #初始化节点,将配件全部清除 if(枪身 and 枪身.get_child_count()>0): 枪身.get_child(0).queue_free() if(枪管 and 枪管.get_child_count()>0): 枪管.get_child(0).queue_free() if(瞄准仪 and 瞄准仪.get_child_count()>0): 瞄准仪.get_child(0).queue_free() #检查资源是否存在 if 枪身!=null and 枪身资源: var 武器场景:PackedScene=load(枪身资源.武器场景路径) 枪身.add_child(武器场景.instantiate()) else: #如果武器不存在,初始化其他配件 枪管资源=null 瞄准仪资源=null #检查其他配件,如果存在则添加到节点树 if 枪管!=null and 枪管资源: var 枪管场景:PackedScene=load(枪管资源.武器场景路径) 枪管.add_child(枪管场景.instantiate()) if 瞄准仪!=null and 瞄准仪资源: var 瞄准仪场景:PackedScene=load(瞄准仪资源.武器场景路径) 瞄准仪.add_child(瞄准仪场景.instantiate())1
2
3
4
5
6
7
8
9
10
11
12
13
14
+ 背包,负责更新装备
```python
extends Control
@export var 武器展示场景: 装备模型
@export var 武器装备场景: 装备模型
@export var 物品背包:Array[Resource]
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.1
2
3
4
5
6
7
8
9
10
11# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
更新装备(武器展示场景);
更新装备(武器装备场景);
pass
func 更新装备(data:装备模型):
if data:
data.枪身资源=物品背包[0]
data.枪管资源=物品背包[1]
data.瞄准仪资源=物品背包[2]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
45extends PanelContainer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
texture_rect=get_node("TextureRect")
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if 背包.物品背包[索引]:
texture_rect.texture=背包.物品背包[索引].icon
else:
texture_rect.texture=preload("res://Icon/空纹理.png")
pass
func _get_drag_data(position):
if 背包.物品背包[索引]:
var cpb =TextureRect.new()
cpb.texture=背包.物品背包[索引].icon
set_drag_preview(cpb)
return 背包.物品背包[索引]
func _can_drop_data(position, data):
# 检查是否为武器基类
if data is Resource:
return true
else:
return false
#数据处理
func _drop_data(position, data):
print(data)
if 背包.物品背包[索引]==null:
var ite=背包.物品背包.find(data)
背包.物品背包
[索引]=data
背包.物品背包[ite]=null
else :
var ite=背包.物品背包.find(data)
var temp=背包.物品背包[索引]
背包.物品背包[索引]=data
背包.物品背包[ite]=temp
架构设计
- 属性系统作为单个场景存在,主要用于管理角色技能,属性,效果,
- 属性:
- 属性通过属性资源创建
MVC设计,仿AURA
HUD
- 属性
| 属性 | 描述 |
|---|---|
| 叠加层:widgetBase=null | 字节点,各种UI的集合 |
| widgetcontrol:widgetControl=null | 数据控制层 |
- 方法
| 方法 | 描述 | |
|---|---|---|
| 初始化_叠加层(玩家状态,玩家控制器,玩家,玩家能力系统) | 在玩家节点初始化属性完成后调用 | 公开 |
| _get_数据控制层 | 初始化时调用,创建控制器单例 | 私有 |
1 | extends Control |
WidgetBase 用户控件基类
- 属性
| 属性 | 描述 |
|---|---|
| widgetControl:WidgetControl | 数据控制器 |
- 方法
| 方法 | 描述 |
|---|---|
| set_widgetControl(v_Control:WidgetControl) | 在HUD设置控制器 |
| 控制层被设置时 | 当控制器被设置时调用,用于绑定控制器事件 |
| _信号_生命值被改变(NewHealth:float) | 接收值设置UI显示 |
1 | extends ProgressBar |
WidgetControl 属性控制器
- 属性
| 属性 | 描述 |
|---|---|
| var 玩家控制器:Node | |
| var 玩家控状态:Node | |
| var 玩家对象:Node | |
| var 玩家能力系统:能力系统 |
- 信号
| 信号 | 描述 |
|---|---|
| signal 委托_玩家生命值改变时(NewHealth:float) | 属性改变时发出 |
- 方法
| 方法 | 描述 |
|---|---|
| func 设置_数据控制器参数(数据结构:StructTest): | 初始化控制器携带数据 |
| func 广播_初始化(): | 在属性初始化时广播刷新UI显示 |
| func 实时监听_属性变化(): | 绑定实时更是UI,在属性集改变属性中发出信号 |
1 | extends Object |
StructTest
1 | extends Object |
输入映射单例
1 | func 添加输入映射(动作名: String, 键值: int) -> void: |
1 | extends Node |
Comment
匿名评论隐私政策
TwikooWaline
✅ 你无需删除空行,直接评论以获取最佳展示效果














