Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | sxkod |
Hi all
I have been trying to code an npc who follows the player. I have been tearing my hair out - or what is left of it. It probably is a dumb mistake but can’t find it for my life. I can generate a path, draw the path even. However, when I try to use the path to move_and_slide, my npc keeps flitting directions and no actual movements.
I put the screenshot of the navmesh scene and it’s child npc scene below. These scenes are part of a bigger code but I cleaned most of the irrelevant stuff. Any help greatly appreciated
https://imagebin.ca/v/6eFEU1EXBKZs
https://imagebin.ca/v/6eFEdhJgYFdQ
Thanks
extends KinematicBody
onready var dnode=get_parent().get_node("dnode")
onready var nav=get_parent().get_node("nav")
var path = []
const move_speed = 2
var stop_dist=1
var dstat=0
var mtgt=null
func _process(delta):
#if not get_parent().ply_inzone:
# return
dstat+=1
if dstat>50 and path.size()<=0 and mtgt:
path=nav.get_simple_path(global_transform.origin, mtgt.global_transform.origin)
print("made path ",path)
_draw_path(dnode,path)
dstat=0
_follow_path()
func _input(event):
if Input.is_key_pressed(KEY_G):
mtgt=get_parent().get_node("p1")
path=[]
elif Input.is_key_pressed(KEY_H):
mtgt=get_parent().get_node("p2")
path=[]
func _follow_path():
if path.size()>0:
var tgt=path[0]
if transform.origin.distance_to(tgt)<stop_dist:
path.remove(0)
if path.size()>0:
_move_along(path[0])
else:
_move_along(tgt)
func _turn_towards(pos):
var ldir=pos
ldir.y=global_transform.origin.y
look_at(ldir, Vector3(0,1,0))
func _move_along(pos):
_turn_towards(pos)
var distto=global_transform.origin.distance_to(pos)
if distto>stop_dist:
var dxt=transform.basis.z*-move_speed
move_and_slide(dxt)
func _draw_path(dnode,dpx): #expects a immediate geometry node and a path array
var m = SpatialMaterial.new()
m.flags_unshaded = true
m.flags_use_point_size = true
m.albedo_color = Color(1.0, 0.0, 0.0, 1.0)
dnode.set_material_override(m)
dnode.clear()
dnode.begin(Mesh.PRIMITIVE_LINE_STRIP, null)
for x in dpx:
dnode.add_vertex(x)
dnode.end()