52 lines
1.3 KiB
GDScript
52 lines
1.3 KiB
GDScript
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)
|