注意
GDスクリプトを使った方法なので、ACTION GAME MAKER的なベストプラクティスではないですが、こんなやり方もあるよぐらいでメモとして残します
概要
まずチュートリアルの内容で弾を発射する処理を実装した際にキャクターの向きに発射はされるのですが、
クナイなどシンメトリーでないものを発射したい場合は、当然ながら、画像自体は逆向きで発射されるため、違和感がでます。
サンプル
ヴィジュアルスクリプトのやり方
- クナイにAnimationPlayerを作成
- クナイのGameObjectにアニメを登録
- ヴィジュアルスクリプトで登録したアニメを初期アクションに設定
上記がACTION GAME MAKER的なベストプラクティスなんだと思う。
(フォーラムで回答してもらいました。)
GDスクリプトでやる場合
- グローバルにプレイヤーの位置を記録するグローバル変数を追加する
- クナイのスプライト2Dにgdscriptをアタッチさせて、プレイヤーの向き応じてスケールの値を反転させる
extends Node
var player_direction = Vector2.RIGHT
func _physics_process(delta):
if Input.is_action_pressed("ui_left"):
player_direction = Vector2.LEFT
elif Input.is_action_pressed("ui_right"):
player_direction = Vector2.RIGHT
extends Sprite2D
var initial_scale: Vector2
#@onready var player = get_node("/root/CoreScene/GameScenes/GameScene/SceneLayer/BaseLayer/ObjectRoot/Player") as Node2D
func _ready():
initial_scale = scale
if Global.player_direction == Vector2.LEFT:
scale = Vector2(-initial_scale.x, -initial_scale.y)
else:
scale = initial_scale
GDスクリプトの場合はスケールを直接いじるので、1枚しか画像を使わないで良い
というメリットは有るのですが、ヴィジュアルスクリプトは、アニメーションをつけたい場合などはノーコードで記述できるメリットがあります。
(アニメーションや状態管理などをGDでつけるすごく複雑で長い処理を書かないと行けなくなります。)
また、現状同じNodeに対して複数のスクリプトはアタッチできないみたいなので、
どちらかを選択することになり、ヴィジュアルスクリプトで記述できるものは多少無理してでも
ヴィジュアルスクリプトで記述したほうが良いでしょう。
とは言え、Godot自体に興味をもってより複雑なゲームを作りたい人は現れる気がするので
今後もヴィジュアルスクリプトを使わない、やり方はメモとして残しつつ紹介して行こうと思います。
完成したもの
向きに応じてクナイの向きもちゃんと切り替わっていい感じです!