鱼C论坛

 找回密码
 立即注册
查看: 70|回复: 1

[已解决]godot节点无法获取

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求救,为什么代码无法初始化 版本4.4
  1. extends Area2D

  2. var launcher: CharacterBody2D

  3. @export var speed : float
  4. @export var rate : float
  5. @export var max_distance : float

  6. var bullets = []
  7. var distances = []
  8. var scene = preload("res://bullet/bullet.tscn")
  9. var is_firing := false

  10. func _ready() -> void:
  11.         launcher = get_node_or_null("../Player")
  12.         if not launcher:
  13.                 push_error("无法找到 launcher 节点! ")

  14. func _process(delta: float) -> void:
  15.         if Input.is_action_pressed("fire"):
  16.                 _create_bullet()
  17.                
  18.         for each in bullets:
  19.                 var direction = Vector2.UP.rotated(each[0].rotation).normalized()
  20.                 var velocity = direction * speed * delta
  21.                 each[0].position += velocity
  22.                
  23.                 # 判断是否到了最大距离
  24.                 if each[1].distance_to(each[0].position) >= max_distance:
  25.                         each[0].queue_free()
  26.                         bullets.erase(each)
  27.                
  28. func _input(event: InputEvent) -> void:
  29.         if event.is_action_pressed("fire"):
  30.                 await _fire_bullet()
  31.                
  32. func _fire_bullet() -> void:
  33.         if is_firing:
  34.                 return
  35.        
  36.         is_firing = true
  37.         _create_bullet()
  38.         await get_tree().create_timer(rate).timeout
  39.         is_firing = false

  40. func _create_bullet() -> void:
  41.         var ins = scene.instantiate()
  42.         self.add_child(ins)
  43.         assert(launcher != null, "luancher未初始化")
  44.         ins.position = launcher.global_position
  45.         ins.rotation = launcher.global_rotation
  46.        
  47.         var list = [ins, ins.global_position]
  48.         bullets.append(list)
复制代码
最佳答案
3 天前
遇到节点获取问题别慌,我们先从基础排查。以下是代码的主要问题和修正方案:


主要问题分析:
  • 变量未初始化:bullets和distances需要初始化为空数组
  • 节点路径错误:获取Player节点的路径可能不正确
  • 子弹距离计算错误:distance_to()参数使用错误
  • 子弹实例未正确存储:list变量未正确赋值


修正后的完整代码:

  1. extends Area2D

  2. var launcher: CharacterBody2D

  3. @export var speed : float = 300.0
  4. @export var rate : float = 0.2
  5. @export var max_distance : float = 500.0

  6. var bullets = []  # 修复1:初始化数组
  7. var scene = preload("res://bullet/bullet.tscn")
  8. var is_firing := false

  9. func _ready() -> void:
  10.     # 修复2:使用更可靠的节点路径获取方式
  11.     launcher = get_parent().get_node("Player")  # 假设Player节点与当前节点同级
  12.    
  13.     if not launcher:
  14.         push_error("无法找到 launcher 节点! 检查节点路径是否正确")

  15. func _process(delta: float) -> void:
  16.     # 修复3:改用临时数组避免遍历时修改原始数组
  17.     var to_remove = []
  18.    
  19.     for bullet in bullets:
  20.         var direction = Vector2.UP.rotated(bullet.rotation).normalized()
  21.         bullet.position += direction * speed * delta
  22.         
  23.         # 修复4:正确计算移动距离
  24.         if bullet.global_position.distance_to(launcher.global_position) >= max_distance:
  25.             to_remove.append(bullet)
  26.             bullet.queue_free()
  27.    
  28.     # 移除超出距离的子弹
  29.     for bullet in to_remove:
  30.         bullets.erase(bullet)

  31. func _create_bullet() -> void:
  32.     var ins = scene.instantiate()
  33.     add_child(ins)
  34.     bullets.append(ins)  # 修复5:直接添加实例到数组
  35.    
  36.     # 设置初始位置和旋转
  37.     ins.global_position = launcher.global_position
  38.     ins.global_rotation = launcher.global_rotation
复制代码


常见排查步骤:
1. 确认Player节点的name属性确实为"Player"
2. 检查场景树层级关系(按F1打开场景面板)
3. 在Player脚本中添加print(get_path())查看实际路径
4. 确保子弹场景(bullet.tscn)的根节点是继承自Area2D/Node2D
5. 在项目设置中检查输入映射的"fire"动作是否正确定义

如果问题仍然存在,可以尝试使用绝对路径获取节点:

  1. launcher = get_node("/root/MainScene/Player")  # 根据实际场景路径调整
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
屏幕截图 2025-05-17 192548.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   
遇到节点获取问题别慌,我们先从基础排查。以下是代码的主要问题和修正方案:


主要问题分析:
  • 变量未初始化:bullets和distances需要初始化为空数组
  • 节点路径错误:获取Player节点的路径可能不正确
  • 子弹距离计算错误:distance_to()参数使用错误
  • 子弹实例未正确存储:list变量未正确赋值


修正后的完整代码:

  1. extends Area2D

  2. var launcher: CharacterBody2D

  3. @export var speed : float = 300.0
  4. @export var rate : float = 0.2
  5. @export var max_distance : float = 500.0

  6. var bullets = []  # 修复1:初始化数组
  7. var scene = preload("res://bullet/bullet.tscn")
  8. var is_firing := false

  9. func _ready() -> void:
  10.     # 修复2:使用更可靠的节点路径获取方式
  11.     launcher = get_parent().get_node("Player")  # 假设Player节点与当前节点同级
  12.    
  13.     if not launcher:
  14.         push_error("无法找到 launcher 节点! 检查节点路径是否正确")

  15. func _process(delta: float) -> void:
  16.     # 修复3:改用临时数组避免遍历时修改原始数组
  17.     var to_remove = []
  18.    
  19.     for bullet in bullets:
  20.         var direction = Vector2.UP.rotated(bullet.rotation).normalized()
  21.         bullet.position += direction * speed * delta
  22.         
  23.         # 修复4:正确计算移动距离
  24.         if bullet.global_position.distance_to(launcher.global_position) >= max_distance:
  25.             to_remove.append(bullet)
  26.             bullet.queue_free()
  27.    
  28.     # 移除超出距离的子弹
  29.     for bullet in to_remove:
  30.         bullets.erase(bullet)

  31. func _create_bullet() -> void:
  32.     var ins = scene.instantiate()
  33.     add_child(ins)
  34.     bullets.append(ins)  # 修复5:直接添加实例到数组
  35.    
  36.     # 设置初始位置和旋转
  37.     ins.global_position = launcher.global_position
  38.     ins.global_rotation = launcher.global_rotation
复制代码


常见排查步骤:
1. 确认Player节点的name属性确实为"Player"
2. 检查场景树层级关系(按F1打开场景面板)
3. 在Player脚本中添加print(get_path())查看实际路径
4. 确保子弹场景(bullet.tscn)的根节点是继承自Area2D/Node2D
5. 在项目设置中检查输入映射的"fire"动作是否正确定义

如果问题仍然存在,可以尝试使用绝对路径获取节点:

  1. launcher = get_node("/root/MainScene/Player")  # 根据实际场景路径调整
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 19:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表