箱に隠れる
MetalGearSolid スタイル のスニーキング
このゲームのステルスの仕組み
NPCs は、PlayerがLOSかつFOVにいるかをチェックしている
NPCは、Player Layerをチェックしているので、見ているものがPlayerかどうかがわかる
つまり、Playerを隠すには、Player のcollisionを、Player Layerではない別の層に移動すればいい
新しい物理レイヤー
1, 2 , 4, 8 ...
5番目のレイヤーにDisguiseを作る
Disguise = 変装、偽装する
InputMapに"toggle_disguise"アクション追加
Eキーが空いているので割り当てる
Player.gd に関数を追加
code: Player.py
# 変装、Disguise
var is_disguised = false
func _input(event):
if Input.is_action_just_pressed("toggle_disguise"):
toggle_disguise()
func toggle_disguise():
if is_disguised:
reveal()
else:
disguise()
func reveal():
$Sprite.texture = load("res://Heist-Meisters-Assets/GFX/PNG/Hitman 1/hitman1_stand.png")
is_disguised = false
func disguise():
$Sprite.texture = load("res://Heist-Meisters-Assets/GFX/PNG/Tiles/tile_129.png")
is_disguised = true
disguise()と reveal()のボイラープレート
今はシンプルに、キャラクターのSprite.textureを変更するだけ
LightOccluderPolygonの変更
箱と人では、光の遮断範囲が違う。
なので、LightOccluderPolygon リソースをファイルシステムに保存して、
切り替えられるようにする
CharacterOccluderPoly.tres
BoxOccluderPoly.tres
リソースのローカル化 or ユニーク化
別のシーンから継承したシーンの.tres
保存してある.tres
これらを変更すると、継承元のシーンのリソースまで変更されてしまう
リソース > 右クリ > ユニーク化
リソース > 左クリ > Resource > Local to Scene をチェック
することで、リソースをunique化して独自の変更ができる。
KinematicBody2D.collision_layerを変更
Player = 1 = 0b1
Disguse = 16 = 0b10000
ドアやPCの衝突の設定が完了してないが、とりあえず変更する
最終的なdisguise( ) と reveal( )
code: Player.py
var is_disguised = false
const PLAYER_LAYER = 0b1
const DISGUISE_LAYER = 0b10000
func reveal():
$Sprite.texture = load("res://Heist-Meisters-Assets/GFX/PNG/Hitman 1/hitman1_stand.png")
$LightOccluder2D.occluder = load("res://Character/PlayerOccluderpolygon2d.tres")
self.collision_layer = PLAYER_LAYER
is_disguised = false
func disguise():
$Sprite.texture = load("res://Heist-Meisters-Assets/GFX/PNG/Tiles/tile_129.png")
$LightOccluder2D.occluder = load("res://Character/BoxOccluderpolygon2d.tres")
self.collision_layer = DISGUISE_LAYER
is_disguised = true
Sprite.texture
LightOccluder2D.occluder
collision_layer
is_disguised
この4つのパラメータを変更する
変装状態にRiskを課す
このままだと無敵状態なので、下のような制約を課す
移動速度減少
変装回数の制限
変装時間の制限
code: Player.py
# 移動速度係数 (変装時は遅くなる)
var velocity_multiplier = 1
func _physics_process(delta):
update_movement()
move_and_slide(motion * velocity_multiplier)
if is_disguised:
$Label.rect_rotation = -rotation_degrees
$Label.text = str($Timer.time_left).pad_decimals(2)
func disguise():
...
$Label.show()
disguises -= 1
velocity_multiplier = disguise_slowdown
$Timer.start()
func reveal():
...
$Label.hide()
$Timer.stop()
velocity_multiplier = 1
func _ready():
$Label.hide()
$Timer.wait_time = disguise_duration
$Timer.one_shot = true
func _on_Timer_timeout():
reveal()
Timerを追加
制限時間
one_shot
などを設定
変装が終わったら止める
Labelを追加
disguise()したらshow()
reveal() したらhide()
表示する桁は、str.pad_decimal(digit) で小数点以下2桁まで