コンテンツにスキップ

DaiconShadow

kinematic_daicon.png

DaiconShadow - ノードは選択したオブジェクトの下に影を生成します。


パラメーター:

- d3

CharacterBody3D

DaiconShadowのコア。


daicon_parent

Node

影が接続されているノード。


- tile_size

int

タイルサイズとは、3D空間において1メートルに相当するピクセル数を決定するものです。 (要するに、3D空間におけるセルサイズあたりのタイルサイズを指します)

自動的にdaicon_parent**と同期されます。


- z_step

int

Zステップは、高さレベル間のソートシステムにおけるステップです。

例えば、z_step = 10の場合、次のように設定されます:

レベル -1 = -10 レベル 0 = 0 レベル 1 = 10 レベル 2 = 20

自動的にdaicon_parent**と同期されます。


- min_distance

int

テクスチャのモジュレーションの最小距離(メートル単位)。

  • 着色の場合、最適な値は1以上です;
  • 脱色の場合、最適な値は1未満です。

- max_distance

int

親と自分との最大距離(メートル単位)。


shadow_mode

int

影のモジュレーションモード: 「色あせ」、「着色」


stream_mode

int

物理ボディのコアの動作モード: 「Logic」, 「Direct」

Logic ストリームは、ボディが表面上にあるかどうか(is_on_floor)を確認します。Direct では確認しません。


- shape

Node3D

コアに組み込まれるシェイプノード用のセル(衝突処理用)。 CollisionShape3DまたはCollisionPolygon3Dのみを通過させます。 「Shape」セクションに独自の辞書shape_propertiesを持っています。


Shape-раздел

Shape のパラメーターを含みます。


KinematicBody3D-раздел

カーネルのルート・ノードのパラメータ・セクション。

(ドキュメントを見る Godot : CharacterBody3D / KinematicBody3D)


CollisionObject3D-раздел

カーネルのルート・ノードのパラメータ・セクション。

(ドキュメントを見る Godot : CollisionObject3D)

Info

axis_lock も含まれる。


方法:

- _ready

各起動時にカーネルをデプロイする。ノードの基本設定を行います。


- _process

Синхронизирует перемещение ноды в 2D и её ядра в 3D.

Добавляет в исключение коллизии с daicon_parent, обновляет модуляцию тени (срабатывает единожды при запуске).


- physics_process

コアの位置を更新し、z_indexを更新し、影を描画します。

func _physics_process(delta: float) -> void:
    if not Engine.is_editor_hint():
        if daicon_parent and daicon_parent.d3:
            var distance := d3.position.distance_to(daicon_parent.d3.global_position - daicon_parent.offset_3d)

            if stream_mode:
                #direct
                _update_direct_position(distance)
            elif not stream_mode:
                #logic
                _update_position(distance, delta)

_update_modulation

func _update_modulation(distance):
    if shadow_mode:
        #coloration
        if distance > min_distance:
            self.modulate.a = _initial_alpha
        else:
            self.modulate.a = lerp(0.0, _initial_alpha, distance / min_distance)
    elif not shadow_mode:
        #discoloration
        if distance > min_distance:
            self.modulate.a = lerp(0.0, _initial_alpha, min_distance / distance)
        else:
            self.modulate.a = _initial_alpha

この機能は、影の透明度を更新します。


- update_pos

func _update_position(distance, delta):
    if daicon_parent.d3.is_on_floor():
        self.visible = true
        _update_modulation(distance)

        self.position.y = start_y
        d3.position = daicon_parent.d3.position - daicon_parent.offset_3d
        self.z_index = (round(d3.position.y + 0.3) * z_step) + 1
    else:
        if distance < max_distance:
            d3.velocity.y -= GRAVITY * delta
        else:
            self.visible = false
            d3.position = daicon_parent.d3.position - daicon_parent.offset_3d

        if d3.is_on_floor():
            self.visible = true
            _update_modulation(distance)
            self.position.y = start_y + (distance * tile_size)
            self.z_index = (round(d3.position.y + 0.3) * z_step) + 1
            d3.position = daicon_parent.d3.position - daicon_parent.offset_3d
    d3.move_and_slide()

この機能は、オブジェクトの2次元空間内の位置を更新し、ノードのz_indexを決定します。 (論理的な流れのため)


- _update_direct_position

func _update_direct_position(distance):
    if distance < max_distance:
        d3.velocity.y = -GRAVITY
    else:
        self.visible = false
        d3.position = daicon_parent.d3.position - daicon_parent.offset_3d

    if d3.is_on_floor():
        self.visible = true
        _update_modulation(distance)
        self.position.y = start_y + (distance * tile_size)
        self.z_index = (round(d3.position.y + 0.3) * z_step) + 1
        d3.position = daicon_parent.d3.position - daicon_parent.offset_3d
    d3.move_and_slide()

この機能は、オブジェクトの2次元空間内の位置を更新し、ノードのz_indexを決定します。 (直流用)


- _expand

func _expand() -> void:
    _expand_d3()
    if shape_properties:
        _expand_shape()

この関数は、カーネルのデプロイメントを扱う。