class_name OverworldCamera extends Camera3D enum TargetType { FREE, FOLLOW_NODE } enum FollowType { INSTANT, SMOOTH } @export_category("Follow Target") @export var targetNode:Node3D = null @export var targetType:TargetType = TargetType.FOLLOW_NODE @export var targetPosition:Vector3 = Vector3.ZERO @export_category("Follow Settings") @export var targetOffset:Vector3 = Vector3.ZERO @export var positionOffset:Vector3 = Vector3(3, 10, 0) @export var pixelPerfect:bool = true func getTargetLookAt() -> Vector3: var targetPos:Vector3 if TargetType.FREE: targetPos = self.targetPosition elif TargetType.FOLLOW_NODE: if targetNode == null: targetPos = self.global_transform.origin + self.global_transform.basis.z else: targetPos = targetNode.global_transform.origin targetPos += targetOffset return targetPos func getTargetPosition() -> Vector3: var targetPos = getTargetLookAt() targetPos += positionOffset return targetPos func _process(_delta: float) -> void: var targetPos = getTargetPosition() global_transform.origin = targetPos var lookAt = getTargetLookAt() look_at(lookAt, Vector3.UP) func _enter_tree() -> void: var targetPos = getTargetPosition() global_transform.origin = targetPos var lookAt = getTargetLookAt() look_at(lookAt, Vector3.UP)