EG/scripts/FollowerScript.py
2025-07-10 09:19:51 +08:00

69 lines
2.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
跟随脚本 - 让对象跟随指定的目标对象
"""
from core.script_system import ScriptBase
from panda3d.core import Vec3
class FollowerScript(ScriptBase):
"""跟随脚本类"""
def __init__(self):
super().__init__()
self.target = None # 跟随目标
self.follow_speed = 5.0 # 跟随速度
self.follow_distance = 2.0 # 跟随距离
self.is_following = True # 是否正在跟随
def start(self):
"""脚本开始时调用"""
self.log("跟随脚本启动!")
self.log(f"跟随参数: 速度={self.follow_speed}, 距离={self.follow_distance}")
def update(self, dt):
"""每帧更新"""
if not self.is_following or self.target is None:
return
target_pos = self.target.getPos()
current_pos = self.gameObject.getPos()
# 计算目标方向
direction = target_pos - current_pos
distance = direction.length()
# 如果距离大于跟随距离,则移动
if distance > self.follow_distance:
if distance > 0:
direction.normalize()
# 计算目标位置(保持跟随距离)
target_follow_pos = target_pos - direction * self.follow_distance
# 平滑移动到目标位置
move_direction = target_follow_pos - current_pos
move_distance = move_direction.length()
if move_distance > 0:
move_direction.normalize()
move_amount = min(self.follow_speed * dt, move_distance)
new_pos = current_pos + move_direction * move_amount
self.gameObject.setPos(new_pos)
# 朝向目标
self.gameObject.lookAt(target_pos)
def set_target(self, target):
"""设置跟随目标"""
self.target = target
if target:
self.log(f"设置跟随目标: {target.getName()}")
else:
self.log("清除跟随目标")
def on_destroy(self):
"""脚本销毁时调用"""
self.log("跟随脚本停止")