Some changes
This commit is contained in:
@@ -1,51 +1,66 @@
|
||||
class_name OverworldCamera extends Camera3D
|
||||
|
||||
enum TargetType {
|
||||
FREE,
|
||||
FOLLOW_NODE
|
||||
}
|
||||
const COLLISION_MARGIN:float = 0.3
|
||||
|
||||
enum FollowType {
|
||||
INSTANT,
|
||||
SMOOTH
|
||||
}
|
||||
|
||||
@export_category("Follow Target")
|
||||
@export_category("Target")
|
||||
@export var targetNode:Node3D = null
|
||||
@export var targetType:TargetType = TargetType.FOLLOW_NODE
|
||||
@export var targetPosition:Vector3 = Vector3.ZERO
|
||||
@export var pivotOffset:Vector3 = Vector3(0, 1.2, 0)
|
||||
|
||||
@export_category("Follow Settings")
|
||||
@export var targetOffset:Vector3 = Vector3.ZERO
|
||||
@export var positionOffset:Vector3 = Vector3(3, 10, 0)
|
||||
@export var pixelPerfect:bool = true
|
||||
@export_category("Orbit")
|
||||
@export var distance:float = 10.0
|
||||
@export var minDistance:float = 1.5
|
||||
@export var orbitSensitivity:float = 120.0
|
||||
@export var pitchMin:float = -10.0
|
||||
@export var pitchMax:float = 70.0
|
||||
|
||||
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
|
||||
@export_category("Collision")
|
||||
@export_flags_3d_physics var collisionMask:int = 1
|
||||
|
||||
targetPos += targetOffset
|
||||
return targetPos
|
||||
var _yaw:float = 0.0
|
||||
var _pitch:float = 30.0
|
||||
|
||||
func getTargetPosition() -> Vector3:
|
||||
var targetPos = getTargetLookAt()
|
||||
targetPos += positionOffset
|
||||
return targetPos
|
||||
func _process(delta:float) -> void:
|
||||
if targetNode == null:
|
||||
return
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
var targetPos = getTargetPosition()
|
||||
global_transform.origin = targetPos
|
||||
var lookAt = getTargetLookAt()
|
||||
look_at(lookAt, Vector3.UP)
|
||||
var orbitInput:Vector2 = Input.get_vector(
|
||||
"camera_orbit_left", "camera_orbit_right",
|
||||
"camera_orbit_up", "camera_orbit_down"
|
||||
)
|
||||
_yaw += orbitInput.x * orbitSensitivity * delta
|
||||
# Invert Y so stick-up = camera rises (bird's-eye)
|
||||
_pitch -= orbitInput.y * orbitSensitivity * delta
|
||||
_pitch = clamp(_pitch, pitchMin, pitchMax)
|
||||
|
||||
func _enter_tree() -> void:
|
||||
var targetPos = getTargetPosition()
|
||||
global_transform.origin = targetPos
|
||||
var lookAt = getTargetLookAt()
|
||||
look_at(lookAt, Vector3.UP)
|
||||
var pivot:Vector3 = targetNode.global_transform.origin + pivotOffset
|
||||
var yawRad:float = deg_to_rad(_yaw)
|
||||
var pitchRad:float = deg_to_rad(_pitch)
|
||||
var dir:Vector3 = Vector3(
|
||||
sin(yawRad) * cos(pitchRad),
|
||||
sin(pitchRad),
|
||||
cos(yawRad) * cos(pitchRad)
|
||||
)
|
||||
|
||||
var desired:Vector3 = pivot + dir * distance
|
||||
var actual:Vector3 = _resolveCollision(pivot, desired)
|
||||
|
||||
global_transform.origin = actual
|
||||
look_at(pivot, Vector3.UP)
|
||||
|
||||
# Cast a ray from the pivot to the desired camera position.
|
||||
# If terrain blocks the shot, pull the camera in to just in front of the hit.
|
||||
func _resolveCollision(pivot:Vector3, desired:Vector3) -> Vector3:
|
||||
var space:PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
|
||||
var query:PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(pivot, desired)
|
||||
query.collision_mask = collisionMask
|
||||
|
||||
var hit:Dictionary = space.intersect_ray(query)
|
||||
if hit.is_empty():
|
||||
return desired
|
||||
|
||||
var hitDir:Vector3 = (desired - pivot).normalized()
|
||||
var pulled:Vector3 = hit["position"] - hitDir * COLLISION_MARGIN
|
||||
var pulledDist:float = (pulled - pivot).length()
|
||||
if pulledDist < minDistance:
|
||||
return pivot + hitDir * minDistance
|
||||
return pulled
|
||||
|
||||
@@ -29,7 +29,8 @@ var button := func():
|
||||
# Interaction settings
|
||||
@export_category("Interactions")
|
||||
@export var interactType:InteractType = InteractType.NONE
|
||||
@export var conversation:Array[ConversationResource] = []
|
||||
@export var dialogueResource:DialogueResource = null
|
||||
@export var dialogueTitle:String = "start"
|
||||
@export var oneTimeItem:ItemResource = null
|
||||
@export var cutscene:CutsceneResource = null
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
class_name EntityInteractableArea extends Area3D
|
||||
const ItemAction = preload("res://cutscene/item/ItemAction.gd")
|
||||
const DialogueAction = preload("res://cutscene/dialogue/DialogueAction.gd")
|
||||
|
||||
@export var entity:Entity
|
||||
|
||||
@@ -11,9 +12,7 @@ func isInteractable() -> bool:
|
||||
return false
|
||||
|
||||
if entity.interactType == Entity.InteractType.CONVERSATION:
|
||||
if entity.conversation.size() == 0:
|
||||
return false
|
||||
return true
|
||||
return entity.dialogueResource != null
|
||||
|
||||
if entity.interactType == Entity.InteractType.CUTSCENE:
|
||||
if entity.cutscene == null:
|
||||
@@ -33,12 +32,17 @@ func isInteractable() -> bool:
|
||||
|
||||
if entity.interactType == Entity.InteractType.BATTLE_TEST:
|
||||
return true
|
||||
|
||||
|
||||
return false
|
||||
|
||||
func _onConversationInteract(_other:Entity) -> void:
|
||||
assert(entity.dialogueResource != null)
|
||||
var cutscene:Cutscene = Cutscene.new()
|
||||
cutscene.addConversation(entity.conversation)
|
||||
cutscene.addCallable(DialogueAction.getDialogueCallable(
|
||||
entity.dialogueResource,
|
||||
entity.dialogueTitle,
|
||||
[entity]
|
||||
))
|
||||
cutscene.start()
|
||||
|
||||
func _onItemInteract(_other:Entity) -> void:
|
||||
@@ -51,7 +55,7 @@ func _onItemInteract(_other:Entity) -> void:
|
||||
func onInteract(other:Entity) -> void:
|
||||
if entity.interactType == Entity.InteractType.NONE:
|
||||
return
|
||||
|
||||
|
||||
match entity.interactType:
|
||||
Entity.InteractType.CONVERSATION:
|
||||
_onConversationInteract(other)
|
||||
@@ -66,7 +70,7 @@ func onInteract(other:Entity) -> void:
|
||||
entity.cutscene.queue(cutscene)
|
||||
cutscene.start()
|
||||
return
|
||||
|
||||
|
||||
Entity.InteractType.BATTLE_TEST:
|
||||
var testEnemy = BattleFighter.new({
|
||||
'controller': BattleFighter.FighterController.AI
|
||||
|
||||
@@ -1 +1,10 @@
|
||||
extends Node3D
|
||||
|
||||
func _ready() -> void:
|
||||
# Assign dialogue resources after the plugin has imported the .dialogue files.
|
||||
# Once the DialogueManager plugin is enabled in the editor, you can assign
|
||||
# dialogueResource directly in the Inspector instead.
|
||||
var npc:Entity = $NotPlayer
|
||||
if npc:
|
||||
npc.dialogueResource = load("res://dialogue/npc/test.dialogue")
|
||||
npc.dialogueTitle = "start"
|
||||
|
||||
@@ -1,19 +1,12 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://d0ywgijpuqy0r"]
|
||||
[gd_scene load_steps=9 format=3 uid="uid://d0ywgijpuqy0r"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://xe6pcuq741xi" path="res://overworld/map/TestMap.gd" id="1_6ms5s"]
|
||||
[ext_resource type="PackedScene" uid="uid://cluuhtfjeodwb" path="res://overworld/map/TestMapBase.tscn" id="1_ox0si"]
|
||||
[ext_resource type="PackedScene" uid="uid://by4a0r2hp0w6s" path="res://overworld/entity/Entity.tscn" id="2_jmygs"]
|
||||
[ext_resource type="Script" uid="uid://yn7kxdargafx" path="res://cutscene/conversation/ConversationResource.gd" id="3_p7git"]
|
||||
[ext_resource type="Script" uid="uid://38ya6vphm5bu" path="res://item/ItemResource.gd" id="4_xf0pb"]
|
||||
[ext_resource type="Script" uid="uid://b5c8g5frishjs" path="res://cutscene/cutscene/TestCutscene.gd" id="5_125nt"]
|
||||
[ext_resource type="Script" uid="uid://8tsov4ihmnxl" path="res://overworld/camera/OverworldCamera.gd" id="7_tr4a0"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xf0pb"]
|
||||
script = ExtResource("3_p7git")
|
||||
entity = NodePath(".")
|
||||
label = "Test"
|
||||
metadata/_custom_type_script = "uid://yn7kxdargafx"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_125nt"]
|
||||
script = ExtResource("4_xf0pb")
|
||||
item = 1
|
||||
@@ -31,7 +24,6 @@ script = ExtResource("1_6ms5s")
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00883961, 1.11219, 0.0142021)
|
||||
entityId = "bcabec96-8d33-4c16-a997-3bb3b0562b33"
|
||||
interactType = 1
|
||||
conversation = Array[ExtResource("3_p7git")]([SubResource("Resource_xf0pb")])
|
||||
|
||||
[node name="NotPlayer4" parent="." instance=ExtResource("2_jmygs")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.68074, 1.11219, 0.0142021)
|
||||
|
||||
Reference in New Issue
Block a user