Top.Mail.Ru
Ответы

Помогите создать скрипт для моба в godot

Скрипт для следованием за игроком есть, но он не останавливается перед каждым бугром. Помогите написать код чтобы он прыгал за игроком

По дате
По рейтингу
Аватар пользователя
Новичок

вот пример кода с rigidbody2d, скидываю из заброшенного проекта, тут много лишнего что не относится к задаче, код который тебе нужен - в конце. а вообще свою реализацию советую написать, если не используешь rigidbody

func _integrate_forces(state: PhysicsDirectBodyState2D) -> void:

var step = state.get_step()

var direction: Vector2

velocity = state.get_linear_velocity()

if is_tower_target:

target_obj = enemy_tower

else:

var creeps_in_area = check_area.get_overlapping_bodies()

if creeps_in_area:

var nearest_creep: Creep = creeps_in_area[0]

for c in creeps_in_area:

if self.global_position.distance_to(c.global_position) < self.global_position.distance_to(nearest_creep.global_position):

nearest_creep = c

target_obj = nearest_creep

else:

is_tower_target = true

if is_instance_valid(target_obj):

direction = self.global_position.direction_to(target_obj.global_position)

var distance = self.global_position.distance_to(target_obj.global_position)

sword_transform.position.x = lerp(sword_transform.position.x, sign(direction.x) * sword_offset, 0.1)

#sword_transform.rotation_degrees = lerp(sword_transform.rotation_degrees, sign(direction.x) * 0, 0.05)

sword_visual.transform = sword_transform.transform

if not is_punch:

if attack_area.get_overlapping_bodies():

var direction_x = signf(self.global_position.direction_to(target_obj.global_position).x)

sword.punch(direction_x)

for contact_index in state.get_contact_count():

var collision_normal = state.get_contact_local_normal(contact_index)

if collision_normal.dot(Vector2(0, -1)) > .6:

if target_obj is Creep or (target_obj is DefenceTower and self.global_position.distance_to(target_obj.global_position) > 150):

velocity.y -= JUMP_VELOCITY * step

else:

velocity.y -= (JUMP_VELOCITY * 2.75) * step

is_push = false

if abs(velocity.x) > 10.0:

walk_animation.play("walk")

else:

walk_animation.pause()

if not is_push:

velocity.x += 2.5 * direction.x

if abs(velocity.x) >= MAX_SPEED:

velocity.x = sign(velocity.x) * MAX_SPEED

state.set_linear_velocity(velocity)

func _physics_process(delta: float) -> void:

if is_replace:

set_linear_velocity(Vector2.ZERO)

self.global_position = pos_to_replace

is_replace = false