性能优化 技能释放方向死区 透视相机

master
chendian 9 months ago
parent 2b2f80907a
commit e82199d316

@ -255,6 +255,10 @@ limits/multithreaded_server/rid_pool_prealloc=100
settings_file="res://setting/MetSysSettings.tres"
[physics]
3d/physics_engine="Jolt Physics"
[rendering]
textures/canvas_textures/default_texture_filter=0

@ -12,7 +12,7 @@ background_mode = 1
sky = SubResource("Sky_hmsea")
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.5
ambient_light_energy = 0.15
tonemap_white = 2.39
ssil_enabled = true
ssil_intensity = 0.4

@ -5,6 +5,6 @@
[resource]
render_priority = 0
shader = ExtResource("2_camhu")
shader_parameter/color = null
shader_parameter/color = Color(0, 0, 0, 1)
shader_parameter/deformation_dir = Vector2(1, 0)
shader_parameter/deformation_rate = 0.0

@ -12,7 +12,7 @@ render_priority = 0
shader = ExtResource("1_ggegd")
shader_parameter/is_target = false
shader_parameter/is_focus = false
shader_parameter/target_position_y = 1.28
shader_parameter/character_position = Vector3(0, 0, 0)
shader_parameter/target_level_top_y = 5.76
shader_parameter/focus_min = Vector3(0, 0, 0)
shader_parameter/focus_max = Vector3(13.44, 7.04, 7.04)

@ -1,7 +1,7 @@
shader_type spatial;
uniform bool is_target = false;
uniform bool is_focus = false;
uniform float target_position_y = 0;
uniform vec3 character_position = vec3(0,0,0);
uniform float target_level_top_y = 0;
uniform vec3 focus_min = vec3(0,0,0);
uniform vec3 focus_max = vec3(0,0,0);
@ -14,7 +14,7 @@ uniform sampler2D tex_material_normal : source_color;
uniform sampler2D tex_material_sub : source_color;
uniform sampler2D tex_material_normal_sub : source_color;
varying vec3 world_position;
varying vec4 world_position;
varying vec2 uv1;
varying vec2 uv2;
varying vec2 uv_sub;
@ -22,7 +22,7 @@ varying vec2 uv_material;
void vertex()
{
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0));
vec2 local_uv = vec2(world_position.x,world_position.y + world_position.z);
uv1 = local_uv / 32.0;
uv2 = local_uv / 32.0;
@ -48,19 +48,25 @@ void fragment() {
discard;
}else{
float brightness = 1.0;
if(is_target){
float offset_y = abs(floor((world_position.y-target_position_y) / 0.02) * 0.02);
offset_y = max(0.0,offset_y-0.64);
float rate = clamp(1.0-offset_y/4.48,0.0,1.0);
brightness = rate;
}else{
brightness = 1.0;
}
//if(is_target){
//float offset_y = abs(floor((world_position.y-character_position.y) / 0.02) * 0.02);
//offset_y = max(0.0,offset_y-0.64);
//float rate = clamp(1.0-offset_y/4.48,0.0,1.0);
//brightness = rate;
//}else{
//brightness = 1.0;
//}
vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
bool is_light = c.r+c.g+c.b>2.8;
if(!is_light && world_normal.y<0.1){
brightness = brightness*0.6;
}
if (!is_light){
//三大面
if(!is_light && world_normal.y<0.1){
brightness = brightness*0.6;
}
else if(!is_light && world_normal.x<0.1){
brightness = brightness*0.8;
}
}
//通用网格纹理
float noise_value1 = texture(tex_noise1,floor(uv1 /0.02) *0.02).r;

@ -6,6 +6,7 @@ uniform int mark_type = 0; //0空气墙 1黑块 2绿幕
uniform sampler2D tex : source_color;
uniform sampler2D tex_sub1 : source_color;
void fragment() {
if (is_open){
if (mark_type == 0){

File diff suppressed because one or more lines are too long

@ -58,10 +58,9 @@ script = ExtResource("2_ewhkj")
[node name="CameraManager" type="Camera3D" parent="GameManager/Stage/SubViewport"]
transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 4.01178, 2.85449)
environment = ExtResource("8_mbfoj")
projection = 1
current = true
fov = 6.0
size = 7.2
frustum_offset = Vector2(2, 0)
script = ExtResource("4_yqiun")
global_effect_curve = SubResource("Curve_f8hvs")

@ -79,6 +79,10 @@ data = {
}
metadata/_editor_floor_ = Vector3(0, 6, 0)
[node name="BornPos" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.4, 2, 4)
[node name="Sprite3D" type="Sprite3D" parent="."]
transform = Transform3D(640, 0, 0, 0, 320, 0, 0, 0, 1, 281.6, -19.2, 0)
visible = false
@ -87,10 +91,6 @@ pixel_size = 0.02
texture_filter = 0
texture = ExtResource("9_nngl3")
[node name="BornPos" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 183.799, 21.3702, 3.10911)
[node name="Levels" type="Node3D" parent="."]
unique_name_in_owner = true

@ -8,6 +8,9 @@ class AttackInfo:
var with_stop: bool = false
var ignore_push: bool = false
class AttackHitInfo:
var attack_info: AttackInfo
var hit_target: Character
class HitResultInfo:
var is_hit: bool

@ -9,9 +9,10 @@ var is_active: bool
var alive_time: float
var attack_info: Struct.AttackInfo
var attack_id_set: Dictionary = {}
var attack_hit_info_list: Array[Struct.AttackHitInfo] = []
func _ready():
func _ready():
body_entered.connect(on_body_entered)
@ -19,15 +20,19 @@ func _process(delta: float) -> void:
if is_active:
alive_time -= delta
if alive_time <= 0:
settle_attack_all()
set_active(false)
settle_attack()
func refresh_attack_area(attack_info_new: Struct.AttackInfo) -> void:
settle_attack_all()
attack_info = attack_info_new
var offset_xz: Vector2 = attack_info.attack_dir * attack_info.attack_box.offset.x
var offset_y: float = attack_info.attack_box.offset.y
var offset: Vector3 = Vector3(offset_xz.x, offset_y, offset_xz.y)
var shape: Shape3D = attack_info.attack_box.shape
var offset_y: float = attack_info.attack_box.offset.y
var offset: Vector3 = Vector3(offset_xz.x, offset_y, offset_xz.y)
var shape: Shape3D = attack_info.attack_box.shape
collision.position = offset
collision.shape = shape
@ -36,6 +41,17 @@ func refresh_attack_area(attack_info_new: Struct.AttackInfo) -> void:
set_active(false)
set_active(true)
func settle_attack_all() -> void:
while attack_hit_info_list.size() > 0:
settle_attack()
func settle_attack() -> void:
if len(attack_hit_info_list) == 0:
return
var attack_hit_info: Struct.AttackHitInfo = attack_hit_info_list.pop_at(0)
if not attack_hit_info.hit_target:
return
battle.on_attack_character(attack_hit_info.hit_target, attack_hit_info.attack_info)
func on_body_entered(body: Node3D):
call_deferred("on_body_entereddeferred", body)
@ -50,7 +66,10 @@ func on_body_entereddeferred(body: Node3D):
if attack_info.attack.is_rebound:
if character_to != character and character_to.get_status("is_floating"):
return
battle.on_attack_character(character_to, attack_info)
var attack_hit_info: Struct.AttackHitInfo = Struct.AttackHitInfo.new()
attack_hit_info.attack_info = attack_info
attack_hit_info.hit_target = character_to
attack_hit_info_list.append(attack_hit_info)
attack_id_set[character_to.id] = true

@ -72,9 +72,7 @@ func set_body_scale(cfg: CharacterCfg) -> void:
func set_material(material: ShaderMaterial, material_sub: ShaderMaterial):
view.material_override = material_sub
# view.material_override.next_pass = material_sub
# view.material_override.next_pass = material_sub
#==getter==
func id() -> int: return status.id
@ -134,7 +132,8 @@ func set_pos(pos_new: Vector3):
func emit_pos_changed():
SignalManager.character_pos_changed.emit(id(), pos())
func move_to(dir: Vector2): set_status("move_dir", dir.normalized())
func move_to(dir: Vector2):
set_status("move_dir", dir.normalized())
func move_stop():

@ -15,7 +15,7 @@ func _ready():
radius = shape.radius * scale.x
func _process(delta) -> void:
func _process(_delta) -> void:
var speed_dir: Vector2 = character.get_status("speed_dir") as Vector2
if speed_dir.length() == 0:
return

@ -123,6 +123,8 @@ func update_move_effect(delta):
func update_move_check(delta) -> bool:
var velocity: Vector3 = character.velocity
if velocity.length() == 0:
return false
character.move_and_slide()
var collision_count: int = character.get_slide_collision_count()
if collision_count > 0:

@ -76,7 +76,8 @@ func check_action_pressed(key: String) -> bool:
"test_1":
Global.character_mgr.create_character(ResourceManager.cfg_character_monster_test4, Enum.ETeam.Monster, character.pos())
"test_2":
Global.character_mgr.create_character(ResourceManager.cfg_character_monster_test2, Enum.ETeam.Monster, character.pos())
for i in range(50):
Global.character_mgr.create_character(ResourceManager.cfg_character_monster_test2, Enum.ETeam.Monster, character.pos())
"test_3":
Global.character_mgr.create_character(ResourceManager.cfg_character_monster_test3, Enum.ETeam.Monster, character.pos())
_: return false

@ -117,14 +117,28 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> vo
var target: Character = Global.character_mgr.get_character(status.target)
if target:
cast_dir = character.pos2D().direction_to(target.pos2D()).normalized()
var skill_move_dir: Vector2 = cast_dir
if cfg.is_lock_x:
cast_dir.y = 0
cast_dir = cast_dir.normalized()
if cast_dir.length() == 0:
cast_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT
if cfg.is_lock_x_move:
skill_move_dir = cast_dir
skill_move_dir.y = 0
skill_move_dir = skill_move_dir.normalized()
if skill_move_dir.length() == 0:
skill_move_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT
else:
#限定释放方向为左右45度以内
var angle: float = skill_move_dir.angle()
if angle > PI / 4 and angle < PI * 3 / 4:
angle = PI / 4 if angle < PI / 2 else PI * 3 / 4
elif angle < -PI / 4 and angle > -PI * 3 / 4:
angle = -PI / 4 if angle > -PI / 2 else -PI * 3 / 4
skill_move_dir = Vector2(cos(angle), sin(angle))
#技能重复次数
if status.skill_cfg and status.skill_cfg == cfg:

@ -13,7 +13,7 @@ class Trans:
var trigger_name: StringName
var on_end: bool
var trans_list: Array[Trans] = []
var trans_dict: Dictionary = {}
var move_sprite_frames: SpriteFrames
@ -69,9 +69,8 @@ func _ready():
run("rebound", "airhit2_loop")
func _process(delta) -> void:
func _process(_delta) -> void:
tick_view()
return
func tick_view() -> void:
@ -131,30 +130,36 @@ func _add_trans(from: StringName, to: StringName, condition, compareType, condit
new_trans.to = to
new_trans.trigger_name = trigger_name
new_trans.on_end = on_end
trans_list.append(new_trans)
if not from in trans_dict:
trans_dict[from] = []
trans_dict[from].append(new_trans)
func update_trans(on_end: bool):
for trans in trans_list:
if on_end != trans.on_end:
continue
if not ((trans.from == "any") or (trans.from == animation)):
if not update_trans_by_from("any", on_end):
update_trans_by_from(animation, on_end)
func update_trans_by_from(from: String, on_end: bool) -> bool:
if not from in trans_dict:
return false
for trans_single in trans_dict[from]:
if on_end != trans_single.on_end:
continue
if trans.condition != "":
var conditionValue = status.get(trans.condition)
match trans.compareType:
">": if conditionValue <= trans.conditionValue: continue
"<": if conditionValue >= trans.conditionValue: continue
">=": if conditionValue < trans.conditionValue: continue
"<=": if conditionValue > trans.conditionValue: continue
"=": if conditionValue != trans.conditionValue: continue
if trans.trigger_name != "":
if status.get(trans.trigger_name):
status.set(trans.trigger_name, false)
if trans_single.condition != "":
var conditionValue = status.get(trans_single.condition)
match trans_single.compareType:
">": if conditionValue <= trans_single.conditionValue: continue
"<": if conditionValue >= trans_single.conditionValue: continue
">=": if conditionValue < trans_single.conditionValue: continue
"<=": if conditionValue > trans_single.conditionValue: continue
"=": if conditionValue != trans_single.conditionValue: continue
if trans_single.trigger_name != "":
if status.get(trans_single.trigger_name):
status.set(trans_single.trigger_name, false)
else: continue
play_animation(trans.to)
break
play_animation(trans_single.to)
return true
return false
func update_flip():
scale.x = 1 if status.is_right else -1
@ -179,10 +184,10 @@ func update_material() -> void:
func _update_material():
if not sprite_frames:
return
var material: ShaderMaterial = material_override as ShaderMaterial
var material: ShaderMaterial = material_override as ShaderMaterial
var material2: ShaderMaterial = material_override.next_pass as ShaderMaterial
var tex: Texture2D = sprite_frames.get_frame_texture(animation, frame)
var deformation_rate: float = status.deformation_rate * (0.5 if status.is_floating else 0.4)
var tex: Texture2D = sprite_frames.get_frame_texture(animation, frame)
var deformation_rate: float = status.deformation_rate * (0.5 if status.is_floating else 0.4)
if material:
material.set_shader_parameter("flash_white", status.flash_white_rate)
material.set_shader_parameter("deformation_dir", status.deformation_dir)

@ -78,7 +78,7 @@ func _process(delta: float) -> void:
#存活时间
if not is_collect:
if alive_time <= 0:
queue_free()
Global.item_mgr.destroy_pt(self)
return
else:
alive_time -= delta
@ -107,4 +107,4 @@ func collect() -> void:
Enum.EPtType.MP: target.add_mp_sub(value, true)
_: pass
target.cast_particle(ResourceManager.particle_pt_collect, true)
queue_free()
Global.item_mgr.destroy_pt(self)

@ -49,5 +49,5 @@ func get_born_pos() -> Vector3:
func set_player_position(pos: Vector3) -> void:
grid_block_material.set_shader_parameter("target_position_y", pos.y)
grid_block_material.set_shader_parameter("character_position", pos)
grass_material.set_shader_parameter("character_position", pos)

@ -10,7 +10,7 @@ var target_pos_y: float
var target_pos_now: Vector2 = Vector2.ZERO
var level_size: Vector2 = Vector2(12.8, 7.68)
var level_pos: Vector2 = Vector2.ZERO
var offset: float = 10
var offset: float = 50
var shake_offset_x: float
var camera_limit: Vector3 = Vector3(6.4, 1.7, 2.95) # x,z-up,z-down
var camera_size: float = 7.2

@ -24,7 +24,7 @@ func on_level_loading_end():
if player: player.remove_buff("freeze")
func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Vector2 = Vector2.RIGHT, owner_id: int = 0)->Character:
func create_character(cfg: CharacterCfg, team: Enum.ETeam, pos: Vector3, dir: Vector2 = Vector2.ZERO, owner_id: int = 0)->Character:
var characterNode: Node
match cfg.type:
Enum.ECharacterType.Player: characterNode = ResourceManager.scene_player.instantiate()

@ -1,6 +1,8 @@
extends Node3D
class_name ItemManager
var pt_count: int
func _ready():
Global.item_mgr = self
SignalManager.level_loading_start.connect(on_level_loading_start)
@ -11,18 +13,26 @@ func on_level_loading_start():
func create_pt(type: Enum.EPtType, value: int, pos: Vector3):
value = randi_range(0.5 * value, 1.5 * value)
var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1]
while value > 0:
for i in pt_slice:
if value < i:
continue
value -= i
_create_pt(type, i, pos)
break
if pt_count < 20:
value = randi_range(int(0.5 * value), int(1.5 * value))
var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1]
while value > 0:
for i in pt_slice:
if value < i:
continue
value -= i
_create_pt(type, i, pos)
break
else:
_create_pt(type, value, pos)
func destroy_pt(pt: PT):
pt_count -= 1
pt.queue_free()
func _create_pt(type: Enum.EPtType, value: int, pos: Vector3):
pt_count += 1
var pt: PT = ResourceManager.scene_pt.instantiate() as PT
pt.type = type
pt.value = value

@ -13,7 +13,8 @@ class_name InputItem
modulate.a = value
func _ready() -> void:
SignalManager.input_device_change.connect(_on_input_device_change)
if not Engine.is_editor_hint():
SignalManager.input_device_change.connect(_on_input_device_change)
func _on_input_device_change() -> void:
_on_input_action_set()

Loading…
Cancel
Save