laser.tscn 6,7 КБ
Newer Older
magcourier's avatar
magcourier включено в состав коммита
1
[gd_scene load_steps=13 format=2]
magcourier's avatar
magcourier включено в состав коммита
2
3
4
5
6
7
8
9

[ext_resource path="res://blokoj/kosmosxipoj/resursoj/laser_beam.tres" type="Material" id=1]

[sub_resource type="GDScript" id=1]
script/source = "extends Spatial

var uuid #нужно для идентификации конкретного модуля

magcourier's avatar
magcourier включено в состав коммита
10
export (float) var beam_length = 1000
magcourier's avatar
magcourier включено в состав коммита
11
12
13
14
15
16
17
18
19
20
21
22
23
24
export (float) var speed_rotation = 3
export (Color, RGBA) var laser_color :Color = Color(1.0,0.0,0.0,1.0)
export var x_limiter: Vector2=Vector2(0.0,90.0)
export var y_limiter: Vector2=Vector2(-90.0,90.0)
var target = null

func _ready():
#	target=get_parent().route #это потом удалить, здесь тестовое получение цели.
	$laser.cast_to.z = -beam_length #устанавливаем максимальную дальность лазера.
	$laser/beam/MeshInstance.mesh.material.set(\"shader_param/laser_color\",laser_color)
	$laser/beam/MeshInstance2.mesh.material.set(\"shader_param/laser_color\",laser_color)
	
func rotate_gun(delta):
	var temp = transform.basis #сохраняем старый базис
magcourier's avatar
magcourier включено в состав коммита
25
#	look_at(target.back().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
magcourier's avatar
magcourier включено в состав коммита
26
	look_at(target.get_global_transform().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
magcourier's avatar
magcourier включено в состав коммита
27
28
29
30
	var target_rot = transform.basis#сохраняем целевой базис
	transform.basis = temp#восстанавливаем изначальный базис
	$laser.transform.basis = $laser.transform.basis.slerp(target_rot,speed_rotation*delta) # постепенно поворачиваем к цели
	$laser.rotation_degrees.x = clamp($laser.rotation_degrees.x,x_limiter.x,x_limiter.y)# ограничиваем вращение пушки вниз, чтобы стреляла только в верхнюю полусферу
magcourier's avatar
magcourier включено в состав коммита
31
#	$laser.rotation_degrees.y = clamp($laser.rotation_degrees.y,y_limiter.x,y_limiter.y)# ограничиваем вращение пушки по сторонам, если нужно
magcourier's avatar
magcourier включено в состав коммита
32
	$gun_body.rotation.y = $laser.rotation.y
magcourier's avatar
magcourier включено в состав коммита
33
34
35


func get_uuid(object):
magcourier's avatar
magcourier включено в состав коммита
36
#	print('==name==',object.name)
magcourier's avatar
magcourier включено в состав коммита
37
	if object.get('uuid'):
magcourier's avatar
magcourier включено в состав коммита
38
#		print('=uuid==',object.uuid)
magcourier's avatar
magcourier включено в состав коммита
39
40
41
42
43
		return object.uuid
	else:
		return get_uuid(object.get_parent())


magcourier's avatar
magcourier включено в состав коммита
44
45
func _physics_process(delta):
	if target:
magcourier's avatar
magcourier включено в состав коммита
46
#		print('цель задана')
magcourier's avatar
magcourier включено в состав коммита
47
48
		var length_to_end=beam_length
		var can_shoot = false
magcourier's avatar
magcourier включено в состав коммита
49
50
51
#		if !target.empty():
		rotate_gun(delta)
		if $laser.is_colliding():
magcourier's avatar
magcourier включено в состав коммита
52
53
54
55
			var uuid = \"\"
			if $laser.get_collider().get('uuid'):
				uuid = $laser.get_collider().uuid
			else: # для станции идём по восходящим родителям до нахождения uuid
magcourier's avatar
magcourier включено в состав коммита
56
#				print('ищем uuid')
magcourier's avatar
magcourier включено в состав коммита
57
58
				uuid = get_uuid($laser.get_collider().get_parent())
			if uuid == target.uuid:
magcourier's avatar
magcourier включено в состав коммита
59
#				print('стреляем = ',uuid)
magcourier's avatar
magcourier включено в состав коммита
60
61
62
63
64
65
66
67
	#			print($laser.get_collider().name) #тут можно обработать в кого мы попали и вызвать повреждения.
				length_to_end = get_global_transform().origin.distance_to($laser.get_collision_point())
				can_shoot = true
				$laser/end_point.visible = true
				$laser/beam.visible = true
			else:
				$laser/end_point.visible = false
				$laser/beam.visible = false
magcourier's avatar
magcourier включено в состав коммита
68
69
70
71
		else:
			$laser/end_point.visible = false
			$laser/beam.visible = false
		
magcourier's avatar
magcourier включено в состав коммита
72
73
74
75
76
77
78
79
		if can_shoot:
			$laser/beam.scale.z=length_to_end
			$laser/end_point.translation.z = -length_to_end
			$laser/end_point/Particles.emitting = true
		else:
			$laser/end_point/Particles.emitting = false
			$laser/beam.scale.z=0.1
			$laser/end_point.translation.z = 0
magcourier's avatar
magcourier включено в состав коммита
80
81
82
	else: 
		$laser/end_point.visible = false
		$laser/beam.visible = false
magcourier's avatar
magcourier включено в состав коммита
83
84
85
86

func set_target(targeto):
	if targeto:
		target = targeto
magcourier's avatar
magcourier включено в состав коммита
87
		print('установили цель == ',targeto.uuid)
magcourier's avatar
magcourier включено в состав коммита
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
"

[sub_resource type="CylinderMesh" id=2]
top_radius = 0.11
bottom_radius = 0.11
height = 1.0
radial_segments = 12
rings = 1

[sub_resource type="SpatialMaterial" id=3]
albedo_color = Color( 0.0431373, 0.231373, 0.972549, 1 )

[sub_resource type="SpatialMaterial" id=4]
params_billboard_mode = 3
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
albedo_color = Color( 0.968627, 0.803922, 0.0470588, 1 )
emission_enabled = true
emission = Color( 1, 0.984314, 0, 1 )
emission_energy = 16.0
emission_operator = 0
emission_on_uv2 = false

[sub_resource type="Curve" id=5]
_data = [ Vector2( 0.0253165, 0.990909 ), 0.0, 0.0, 0, 0, Vector2( 0.962025, 0 ), 0.0, 0.0, 0, 0 ]

[sub_resource type="CurveTexture" id=6]
width = 512
curve = SubResource( 5 )

[sub_resource type="ParticlesMaterial" id=7]
lifetime_randomness = 0.5
trail_size_modifier = SubResource( 6 )
direction = Vector3( 0, 0, 1 )
gravity = Vector3( 0, 0, 0 )
initial_velocity = 34.48
initial_velocity_random = 0.72

[sub_resource type="QuadMesh" id=8]
size = Vector2( 0.1, 0.1 )

[sub_resource type="QuadMesh" id=9]
material = ExtResource( 1 )
size = Vector2( 1, 0.3 )

[sub_resource type="CubeMesh" id=10]
size = Vector3( 1, 0.5, 1 )

[sub_resource type="SpatialMaterial" id=11]
albedo_color = Color( 1, 1, 0, 1 )

[node name="laser_gun" type="Spatial"]
script = SubResource( 1 )

[node name="laser" type="RayCast" parent="."]
enabled = true
exclude_parent = false
cast_to = Vector3( 0, 0, 0 )
collide_with_areas = true

[node name="gun_stem" type="MeshInstance" parent="laser"]
transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, -0.5 )
mesh = SubResource( 2 )
material/0 = SubResource( 3 )

[node name="end_point" type="Spatial" parent="laser"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 )
visible = false

[node name="Particles" type="Particles" parent="laser/end_point"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 0.01, 0, 0, 0 )
material_override = SubResource( 4 )
cast_shadow = 0
amount = 50
lifetime = 0.21
process_material = SubResource( 7 )
draw_pass_1 = SubResource( 8 )

[node name="beam" type="Spatial" parent="laser"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 )
visible = false

[node name="MeshInstance" type="MeshInstance" parent="laser/beam"]
transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 0, 0, -0.5 )
cast_shadow = 0
mesh = SubResource( 9 )
material/0 = null

[node name="MeshInstance2" type="MeshInstance" parent="laser/beam"]
transform = Transform( -1.62921e-07, 1, -1.62921e-07, 0, -1.62921e-07, -1, -1, -1.62921e-07, 2.65431e-14, 0, 0, -0.5 )
cast_shadow = 0
mesh = SubResource( 9 )
material/0 = ExtResource( 1 )

[node name="gun_body" type="MeshInstance" parent="."]
mesh = SubResource( 10 )
material/0 = SubResource( 11 )