헤엄치는 속도를 낮추고 물고기를 좌우로만

방치형이라 화면이 늘 눈에 들어와 있고, 빠른 움직임은 몇 분만 지나도 산만하다.

- 속도를 종류별로 절반 이하로 (물고기 0.40 -> 0.15, 게 0.22 -> 0.10 등)
- 멈추는 시간을 늘리고(물고기 0.25~1.1초 -> 1.5~4.5초) 확률도 0.55 -> 0.65
- 물고기가 축에서 벗어나는 각도를 20도 -> 6도로. 수직으로 오르내리지 않는다
- 대신 12% 확률로 크게 틀어 수심을 바꾸게 해서 한 높이에 줄서지 않도록
- 위아래 벽에서 곧장 꺾지 않고 가던 쪽으로 비스듬히 벗어나게

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 15:07:29 +09:00
parent 9eaaabd3b3
commit 7c52c34874
2 changed files with 62 additions and 39 deletions
+57 -39
View File
@@ -113,62 +113,64 @@ func set_roam(area: Rect2, rng: RandomNumberGenerator) -> void:
# rest_odds: 한 번 나아간 뒤 쉴 확률.
match shape:
"crab":
# 바닥을 짚고 좌우로만. 자주 멈춰 선다.
_speed = h * 0.22
# 바닥을 짚고 좌우로만. 자주, 오래 멈춰 선다.
_speed = h * 0.10
_vertical = 0.0
_spread = 0.06
_cruise = Vector2(0.8, 2.0)
_rest = Vector2(0.6, 2.2)
_rest_odds = 0.75
_turn_rate = 3.0
_accel = 6.0
_spread = 0.04
_cruise = Vector2(1.2, 3.0)
_rest = Vector2(1.5, 4.5)
_rest_odds = 0.8
_turn_rate = 1.6
_accel = 3.0
_band = Vector2(0.62, 1.0)
"seahorse":
# 꼬리를 감고 선 채로 오르내린다. 오래 멈춰 있다.
_speed = h * 0.13
# 꼬리를 감고 선 채로 아주 천천히 오르내린다.
_speed = h * 0.07
_vertical = 1.0
_spread = 0.5
_cruise = Vector2(1.0, 2.6)
_rest = Vector2(1.0, 3.0)
_rest_odds = 0.7
_turn_rate = 1.6
_accel = 2.0
_spread = 0.35
_cruise = Vector2(1.5, 3.5)
_rest = Vector2(2.5, 6.0)
_rest_odds = 0.75
_turn_rate = 1.0
_accel = 1.5
_band = Vector2(0.15, 0.92)
"shrimp":
# 거의 멈춰 있다가 짧게 튄다.
_speed = h * 0.6
# 거의 멈춰 있다가 짧게 튄다. 튀는 순간만 빠르다.
_speed = h * 0.35
_vertical = 0.0
_spread = 0.5
_cruise = Vector2(0.15, 0.4)
_rest = Vector2(0.9, 2.6)
_spread = 0.15
_cruise = Vector2(0.2, 0.5)
_rest = Vector2(2.0, 5.0)
_rest_odds = 0.9
_turn_rate = 5.0
_accel = 12.0
_turn_rate = 4.0
_accel = 10.0
_band = Vector2(0.5, 1.0)
"glow":
# 해파리는 물살에 밀리듯 길게 흐르고 가끔 멎는다.
_speed = h * 0.14
_speed = h * 0.07
_vertical = 1.0
_spread = 0.7
_cruise = Vector2(2.5, 5.0)
_rest = Vector2(0.8, 2.0)
_rest_odds = 0.4
_turn_rate = 0.8
_accel = 1.2
_spread = 0.5
_cruise = Vector2(3.5, 7.0)
_rest = Vector2(2.0, 5.0)
_rest_odds = 0.45
_turn_rate = 0.6
_accel = 0.9
_band = Vector2(0.05, 0.78)
_:
_speed = h * 0.4
# 물고기는 거의 좌우로만 다닌다. spread가 0.1이면 6도쯤 --
# 헤엄치는 동안 수심이 눈에 띄게 바뀌지 않을 만큼이다.
_speed = h * 0.15
_vertical = 0.0
_spread = 0.35
_cruise = Vector2(1.6, 3.8)
_rest = Vector2(0.25, 1.1)
_rest_odds = 0.55
_turn_rate = 2.2
_accel = 2.5
_spread = 0.1
_cruise = Vector2(2.5, 6.0)
_rest = Vector2(1.5, 4.5)
_rest_odds = 0.65
_turn_rate = 1.2
_accel = 1.4
_band = Vector2(0.1, 0.95)
# 돌아다니는 것이 큰 움직임을 맡으므로 제자리 흔들림은 줄인다.
_swim_range *= 0.3
_swim_range *= 0.22
_speed *= rng.randf_range(0.82, 1.2)
_heading = _axis_angle() + (PI if rng.randf() < 0.5 else 0.0)
_desired = _heading
@@ -201,7 +203,11 @@ func _new_heading() -> float:
var same_way := forward >= 0.0
if randf() < 0.3:
same_way = not same_way
return axis + (0.0 if same_way else PI) + randf_range(-_spread, _spread)
# 가끔은 크게 틀어 수심을 바꾼다. 늘 제 높이만 오가면 줄지어 다니는 것처럼
# 보이므로, 열 번에 한 번쯤은 비스듬히 올라가거나 내려가게 둔다.
var spread := _spread * (5.0 if randf() < 0.12 else 1.0)
return axis + (0.0 if same_way else PI) + randf_range(-spread, spread)
func _roam_step(delta: float) -> void:
@@ -234,6 +240,18 @@ func _roam_step(delta: float) -> void:
elif position.y > band.y - my:
away.y -= 1.0
if away != Vector2.ZERO:
# 좌우로 다니는 것은 위아래 벽에서도 곧장 꺾지 않는다. 가던 쪽으로
# 나아가면서 비스듬히 벗어난다 -- 수직으로 솟구치면 물고기 같지 않다.
if _vertical < 0.5 and is_zero_approx(away.x):
away.x = signf(cos(_heading))
if is_zero_approx(away.x):
away.x = 1.0
away.y *= 0.45
elif _vertical > 0.5 and is_zero_approx(away.y):
away.y = signf(sin(_heading))
if is_zero_approx(away.y):
away.y = 1.0
away.x *= 0.45
_desired = away.angle()
_resting = false