Перейти к содержанию

DaiconShadow

kinematic_daicon.png

DaiconShadow - нода создает тень под выбранным обьектом.


Параметры:

- d3

CharacterBody3D

Ядро DaiconShadow.


daicon_parent

Node

Узел, к которому прикреплена тень.


- tile_size

int

Размер плитки определяет, сколько пикселей соответствует 1 метру в 3D. (по сути, это размер плитки на размер ячейки в 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

Режим модуляции тени: "Discoloration", "Coloration"


stream_mode

int

Режим поведения ядра физического тела: "Logic", "Direct"

Logic поток проверяет состояние тела относительно поверхности (is_on_floor). Direct - нет.


- shape

Node3D

Ячейка для шейп-ноды которая встраивается в ядро (нужна для столкновений). Пропускает только CollisionShape3D или CollisionPolygon3D. Имеет собственный словарь в разделе "Core": shape_properties.


Shape-раздел

Cодержит параметры для 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_position

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()

Функция обновляет позицию обьекта в 2D пространстве, определяет 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()

Функция обновляет позицию обьекта в 2D пространстве, определяет z_index ноды. (для прямого потока)


- _expand

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

Функция занимается развертыванием ядра.