Needle Engine
  • README
  • Code Of Conduct
  • HOW TO
  • documentation
    • SUMMARY
    • _backlog-mermaid
    • _backlog
    • _meta-test
    • Automatic Component Generation
    • Needle Core Components
    • How To Debug
    • Deployment and Optimization
    • embedding
    • Everywhere Actions
    • Example Projects ✨
    • Exporting Assets, Animations, Prefabs, Materials, Lightmaps...
    • Questions and Answers (FAQ) 💡
    • Feature Overview
    • This page has been moved: continue here
    • getting-started
    • Frameworks, Bundlers, HTML
    • index
    • Additional Modules
    • Networking
    • Needle Engine Project Structure
    • Samples Projects
    • Scripting Examples
    • Creating and using Components
    • Live
    • Live
    • About
    • Live
    • Live
    • Live
    • Live
    • Support, Community & AI
    • Technical Overview
    • Testimonials
    • Testing on local devices
    • Using Needle Engine directly from HTML
    • vision
    • VR & AR (WebXR)
    • blender
      • Needle Engine for Blender
    • cloud
      • Needle Cloud
    • custom-integrations
      • index
    • getting-started
      • Scripting Introduction for Unity Developers
      • Getting Started & Installation
      • Scripting in Needle Engine
    • reference
      • needle.config.json
      • <needle-engine> Configuration
      • @serializable and other decorators
    • three
      • index
    • unity
      • Editor Sync
      • Needle Engine for Unity
    • lang
      • de
        • 404
        • SUMMARY
        • Automatische Komponenten-Generierung
        • Needle-Kernkomponenten
        • Debugging
        • Bereitstellung und Optimierung
        • embedding
        • Everywhere Actions
        • Beispielprojekte ✨
        • Assets, Animationen, Prefabs, Materialien, Lightmaps exportieren...
        • Fragen und Antworten (FAQ) 💡
        • Funktionsübersicht
        • Diese Seite wurde verschoben: hier fortfahren
        • getting-started
        • Frameworks, Bundler, HTML
        • index
        • Zusätzliche Module
        • Netzwerkfunktionen
        • Needle Engine Projektstruktur
        • Beispielprojekte
        • Scripting Beispiele
        • Erstellen und Verwenden von Komponenten
        • Live
        • Live
        • Über
        • Live
        • Live
        • Live
        • Live
        • Support und Community
        • Technischer Überblick
        • Erfahrungsberichte
        • Testen auf lokalen Geräten
        • Needle Engine direkt aus HTML verwenden
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine für Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Einführung in das Scripting für Unity-Entwickler
          • Erste Schritte & Installation
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • <needle-engine> Konfiguration
          • @serializable und andere Decorators
        • three
          • index
        • unity
          • Editor Synchronisierung
          • Needle Engine für Unity
      • es
        • SUMMARY
        • Generación Automática de Componentes
        • Componentes principales de Needle
        • Cómo Depurar
        • Despliegue y optimización
        • embedding
        • Acciones Everywhere
        • Proyectos de Ejemplo ✨
        • Exportación de Assets, Animaciones, Prefabs, Materiales, Lightmaps...
        • Preguntas Frecuentes (FAQ) 💡
        • Resumen de Características
        • Esta página ha sido movida: continúe aquí
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Módulos Adicionales
        • Redes
        • Estructura de Proyecto de Needle Engine
        • Proyectos de ejemplo
        • Ejemplos de scripting
        • Crear y usar Components
        • En vivo
        • En Vivo
        • Acerca de
        • En vivo
        • En vivo
        • En vivo
        • En vivo
        • Soporte y Comunidad
        • Resumen técnico
        • Testimonios
        • Testing on local devices
        • Usando Needle Engine directamente desde HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine para Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introducción al Scripting para Desarrolladores de Unity
          • Primeros pasos e instalación
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • Configuración de <needle-engine>
          • @serializable y otros decoradores
        • three
          • index
        • unity
          • Editor Sync
          • Needle Engine para Unity
      • fr
        • SUMMARY
        • Génération automatique de composants
        • Composants principaux de Needle
        • Comment déboguer
        • Déploiement et Optimisation
        • embedding
        • Everywhere Actions
        • Exemples de Projets ✨
        • Exporter des Assets, des Animations, des Prefabs, des Matériaux, des Lightmaps...
        • Questions et Réponses (FAQ) 💡
        • Aperçu des fonctionnalités
        • Cette page a été déplacée : continuez ici
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Modules supplémentaires
        • Réseau
        • Structure du projet Needle Engine
        • Projets d'exemples
        • Exemples de Scripting
        • Créer et utiliser des Components
        • showcase-bike
        • En direct
        • À propos
        • En direct
        • Jouer
        • En direct
        • En direct
        • Support et Communauté
        • Vue d'ensemble technique
        • Témoignages
        • Tester sur les appareils locaux
        • Utiliser Needle Engine directement depuis HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine pour Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introduction au Scripting pour les Développeurs Unity
          • Premiers pas et installation
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • <needle-engine> Configuration
          • @serializable et autres décorateurs
        • three
          • index
        • unity
          • Synchronisation de l'Editor (Editor Sync)
          • Needle Engine pour Unity
      • hi
        • SUMMARY
        • कंपोनेंट का स्वतः जनरेशन
        • नीडल कोर कंपोनेंट्स
        • How To Debug
        • Deployment and Optimization
        • embedding
        • Everywhere Actions
        • उदाहरण प्रोजेक्ट ✨
        • एसेट, एनिमेशन, प्रीफैब, मटेरियल, लाइटमैप्स... को एक्सपोर्ट करना
        • प्रश्न और उत्तर (FAQ) 💡
        • सुविधा अवलोकन
        • यह पृष्ठ स्थानांतरित कर दिया गया है: यहां जारी रखें
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • अतिरिक्त मॉड्यूल
        • नेटवर्किंग
        • Needle Engine प्रोजेक्ट स्ट्रक्चर
        • samples-and-modules
        • स्क्रिप्टिंग उदाहरण
        • कंपोनेंट बनाना और उपयोग करना
        • लाइव
        • लाइव
        • परिचय
        • लाइव
        • लाइव
        • लाइव
        • लाइव
        • समर्थन और समुदाय
        • तकनीकी अवलोकन
        • प्रशंसापत्र
        • Testing on local devices
        • HTML से सीधे Needle Engine का उपयोग करना
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine for Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Unity डेवलपर्स के लिए स्क्रिप्टिंग परिचय
          • आरंभ करना और इंस्टॉलेशन
          • Needle Engine में स्क्रिप्टिंग
        • reference
          • needle.config.json
          • <needle-engine> कॉन्फ़िगरेशन
          • @serializable and other decorators
        • three
          • index
        • unity
          • Editor Sync
          • Unity के लिए Needle Engine
      • ja
        • SUMMARY
        • 自動コンポーネント生成
        • Needleコアコンポーネント
        • デバッグの方法
        • デプロイと最適化
        • embedding
        • Everywhere Actions
        • サンプルプロジェクト ✨
        • アセット、アニメーション、Prefab、マテリアル、ライトマップなどのエクスポート
        • よくある質問(FAQ)💡
        • 機能概要
        • このページは移動しました: こちらからどうぞ
        • getting-started
        • フレームワーク、バンドラー、HTML
        • index
        • 追加モジュール
        • ネットワーキング
        • Needle Engineプロジェクトの構造
        • サンプルプロジェクト
        • スクリプティング例
        • Creating and using Components
        • ライブ
        • showcase-castle
        • 概要
        • ライブ
        • ライブ
        • ライブ
        • ライブ
        • サポートとコミュニティ
        • 技術概要
        • お客様の声
        • ローカルデバイスでのテスト
        • HTMLからNeedle Engineを直接使用する
        • vision
        • VR & AR (WebXR)
        • blender
          • Blender 用 Needle Engine
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Scripting Introduction for Unity Developers
          • はじめに & インストール
          • Needle Engineでのスクリプティング
        • reference
          • needle.config.json
          • <needle-engine> 設定
          • @serializable およびその他のデコレーター
        • three
          • index
        • unity
          • Editor Sync
          • Unity用Needle Engine
      • pt
        • SUMMARY
        • Automatic Component Generation
        • Componentes Principais do Needle
        • Como Depurar
        • Implementação e Otimização
        • embedding
        • Everywhere Actions
        • Projetos de Exemplo ✨
        • Exportar Recursos, Animações, Prefabs, Materiais, Lightmaps...
        • Perguntas e Respostas (FAQ) 💡
        • Visão Geral dos Recursos
        • Esta página foi movida: continue aqui
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Módulos Adicionais
        • Redes
        • Estrutura do Projeto Needle Engine
        • Projetos de Exemplo
        • Exemplos de Scripting
        • Criar e usar Componentes
        • Ao Vivo
        • Ao Vivo
        • Sobre
        • Ao Vivo
        • Ao Vivo
        • Ao Vivo
        • Ao Vivo
        • Suporte e Comunidade
        • Visão Geral Técnica
        • Depoimentos
        • Testar em dispositivos locais
        • vanilla-js
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine para Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introdução à Scripting para Developers Unity
          • Começar e Instalação
          • Scripting no Needle Engine
        • reference
          • needle.config.json
          • needle-engine-attributes
          • @serializable e outros decorators
        • three
          • index
        • unity
          • Sincronização do Editor
          • Needle Engine para Unity
      • vn
        • 404
        • SUMMARY
        • Automatic Component Generation
        • Các Component Cốt lõi của Needle
        • Cách gỡ lỗi
        • Triển khai và Tối ưu hóa
        • embedding
        • Hành động ở mọi nơi (Everywhere Actions)
        • Các Dự Án Ví Dụ ✨
        • Xuất Tài sản, Hoạt ảnh, Prefab, Vật liệu, Lightmap...
        • Câu hỏi thường gặp (FAQ) 💡
        • Tổng quan tính năng
        • Trang này đã được di chuyển: tiếp tục tại đây
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Các Module Bổ Sung
        • Kết nối mạng
        • Cấu trúc dự án Needle Engine
        • samples-and-modules
        • Ví dụ về Scripting
        • Tạo và sử dụng Component
        • Trực tiếp
        • Trực tiếp
        • Giới thiệu
        • Trực tiếp
        • Chơi thử
        • Trực tiếp
        • Demo trực tiếp
        • Hỗ trợ và Cộng đồng
        • Tổng quan kỹ thuật
        • Lời chứng thực
        • Testing on local devices
        • Sử dụng Needle Engine trực tiếp từ HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine cho Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Giới thiệu về Scripting cho các nhà phát triển Unity
          • Getting Started & Installation
          • Scripting trong Needle Engine
        • reference
          • needle.config.json
          • Cấu hình <needle-engine>
          • @serializable và các decorator khác
        • three
          • index
        • unity
          • Editor Sync
          • Needle Engine cho Unity
      • zh
        • SUMMARY
        • 自动生成组件
        • Needle 核心组件
        • 如何调试
        • 部署与优化
        • embedding
        • Everywhere Actions
        • 示例项目 ✨
        • 导出资源、动画、预制体、材质、光照贴图...
        • 常见问题 (FAQ) 💡
        • 功能概览
        • 此页面已移动:请在此处继续
        • getting-started
        • 框架、打包器、HTML
        • index
        • 附加模块
        • 网络
        • Needle Engine 项目结构
        • 示例项目
        • Scripting Examples
        • Creating and using Components
        • 实时示例
        • 实时
        • 关于
        • 实时演示
        • 在线试玩
        • 实时演示
        • 现场演示
        • 支持与社区
        • 技术概述
        • 用户评价
        • Testing on local devices
        • 使用 Needle Engine 直接从 HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine for Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Scripting Introduction for Unity Developers
          • 入门与安装
          • 在 Needle Engine 中编写脚本
        • reference
          • needle.config.json
          • <needle-engine> 配置
          • @serializable and other decorators
        • three
          • index
        • unity
          • 编辑器同步
          • Unity 版 Needle Engine
Powered by GitBook
On this page
  • O Básico
  • Criar um Componente
  • Campos de Script
  • GameObjects e a Cena
  • Componentes
  • Tipos Unity Renomeados
  • Transform
  • Tempo
  • Raycasting
  • Input
  • Callbacks do InputSystem
  • Debug.Log
  • Gizmos
  • Métodos Utilitários Úteis
  • O projeto Web
  • Instalar packages e dependências
  • Aprender Mais
Edit on GitHub
  1. documentation
  2. lang
  3. pt
  4. getting-started

Introdução à Scripting para Developers Unity

Previousgetting-startedNextComeçar e Instalação

Last updated 25 days ago

O Needle Engine oferece uma integração estreita com o Unity Editor. Isto permite que developers e designers trabalhem juntos num ambiente familiar e entreguem experiências web rápidas, performáticas e leves.

Este guia destina-se principalmente a developers com background em Unity3D, mas também pode ser útil para developers com background em web ou three.js. Abrange tópicos sobre como as coisas são feitas no Unity vs no three.js ou Needle Engine.

Se for completamente novo em Typescript e Javascript e quiser aprofundar-se na escrita de scripts para o Needle Engine, recomendamos também a leitura do para uma compreensão básica das diferenças entre C# e Javascript/Typescript.

Se quiser acompanhar a codificação, pode para criar um pequeno projeto que pode editar no browser ⚡

O Básico

Needle Engine é um motor web 3D que corre sobre . Three.js é uma das bibliotecas de renderização 3D baseadas em webgl mais populares para a web. Sempre que nos referimos a um gameObject no Needle Engine, estamos na verdade também a falar de um Object3D do three.js, o tipo base de qualquer objeto no three.js. Ambos os termos podem ser usados indistintamente. Qualquer gameObject é um Object3D.

Isto também significa que - se já estiver familiarizado com three.js - não terá nenhum problema em usar o Needle Engine. Tudo o que pode fazer com three.js pode ser feito também no Needle Engine. Se já estiver a usar certas bibliotecas, também poderá usá-las num ambiente baseado em Needle Engine.

Nota: O Exporter do Needle Engine NÃO compila o seu código C# existente para Web Assembly. Embora o uso de Web Assembly possa resultar em melhor performance em tempo de execução, tem um alto custo para a velocidade de iteração e flexibilidade na construção de experiências web. Leia mais sobre a nossa e .

:::details Como criar um novo projeto Unity com Needle Engine? (Vídeo):::

Criar um Componente

No Unity, cria um novo componente derivando de MonoBehaviour:

using UnityEngine;
public class MyComponent : MonoBehaviour {
}

Um componente custom no Needle Engine, por outro lado, é escrito da seguinte forma:

import { Behaviour } from "@needle-tools/engine"
export class MyComponent extends Behaviour {
}

Campos de Script

serializable

Se viu alguns scripts do Needle Engine, deve ter notado que algumas variáveis são anotadas com @serializable acima da sua declaração. Este é um Decorator em Typescript e pode ser usado para modificar ou anotar código. No Needle Engine, é usado, por exemplo, para permitir que a serialização principal saiba quais os tipos que esperamos no nosso script quando converte da informação raw do componente armazenada no glTF para uma instância de Componente. Considere o seguinte exemplo:

import { Behaviour, serializable } from "@needle-tools/engine";
import { Object3D } from "three";

class SomeClass extends Behaviour{
    @serializable(Behaviour)
    myOtherComponent?: Behaviour;
    @serializable(Object3D)
    someOtherObject?: Object3D;
}

Isto indica ao Needle Engine que myOtherComponent deve ser do tipo Behaviour. Ele irá então atribuir automaticamente a referência correta ao campo quando a sua cena for carregada. O mesmo se aplica a someOtherObject onde queremos desserializar para uma referência de Object3D.

import { Behaviour, serializable } from "@needle-tools/engine";
class SomeClass {
    @serializable() // < não é necessário tipo aqui porque o tipo do campo é primitivo
    myString?: string;
}

public vs private

Campos sem qualquer modificador de acesso como private, public ou protected serão por padrão public em javascript

import { Behaviour, serializable } from "@needle-tools/engine";
class SomeClass {
    /// nenhum modificador de acesso significa que é público:
    myNumber?: number;
    // tornando-o explicitamente privado:
    private myPrivateNumber?: number;
    protected myProtectedNumber?: number;
}

O mesmo se aplica a métodos também.

GameObjects e a Cena

Para aceder à cena atual a partir de um componente, use this.scene que é equivalente a this.context.scene, isto dá-lhe o objeto raiz da cena three.js.

Para percorrer a hierarquia a partir de um componente, pode iterar sobre os filhos de um objeto com um ciclo for:

for (let i = 0; i < this.gameObject.children; i++) {
    console.log(this.gameObject.children[i]);
}

ou pode iterar usando o equivalente a foreach:

for (const child of this.gameObject.children) {
    console.log(child);
}
import { GameObject } from "@needle-tools/engine";
//---cut-before---
this.gameObject.traverse((obj: GameObject) => console.log(obj))

Outra opção que é bastante útil quando quer apenas iterar objetos renderizáveis é consultar todos os componentes de renderização e iterar sobre eles assim:

import { Renderer } from "@needle-tools/engine";

for(const renderer of this.gameObject.getComponentsInChildren(Renderer))
    console.log(renderer);

Para mais informações sobre como obter componentes, consulte a próxima secção.

Componentes

Encontrar Componentes na Cena

Para obter componentes, pode usar os métodos familiares semelhantes aos do Unity. Note que o seguinte usa o tipo Animator como exemplo, mas pode usar qualquer tipo de componente que seja built-in ou criado por si.

Nome do Método
Descrição

this.gameObject.getComponent(Animator)

Obtém o componente Animator num GameObject/Object3D. Retornará a instância de Animator se tiver um componente Animator ou null se o objeto não tiver tal componente.

this.gameObject.getComponentInChildren(Animator)

Obtém o primeiro componente Animator num GameObject/Object3D ou em qualquer um dos seus filhos

this.gameObject.getComponentsInParents(Animator)

Obtém todos os componentes Animator na hierarquia pai (incluindo o GameObject/Object3D atual)

Estes métodos também estão disponíveis no tipo estático GameObject. Por exemplo, GameObject.getComponent(this.gameObject, Animator) para obter o componente Animator num GameObject/Object3D passado.

Para procurar na cena inteira por um ou múltiplos componentes, pode usar GameObject.findObjectOfType(Animator) ou GameObject.findObjectsOfType(Animator).

Tipos Unity Renomeados

Alguns tipos específicos do Unity são mapeados para nomes de tipos diferentes no nosso engine. Veja a seguinte lista:

Tipo no Unity
Tipo no Needle Engine

UnityEvent

EventList

Um UnityEvent será exportado como um tipo EventList (use serializable(EventList) para desserializar UnityEvents)

GameObject

Object3D

Transform

Object3D

No three.js e Needle Engine, um GameObject e um Transform são o mesmo (não há componente Transform). A única exceção a essa regra é ao referenciar um RectTransform que é um componente no Needle Engine também.

Color

RGBAColor

O tipo de cor do three.js não tem uma propriedade alpha. Por causa disso, todos os tipos Color exportados do Unity serão exportados como RGBAColor que é um tipo custom do Needle Engine

Transform

Os dados de Transform podem ser acedidos diretamente no GameObject / Object3D. Ao contrário do Unity, não há um componente de Transform extra que armazene esses dados.

  • this.gameObject.worldPosition é a posição vector3 no espaço mundo

  • this.gameObject.worldRotation é a euler rotation em ângulos de euler no espaço mundo

  • this.gameObject.worldQuaternion é a quaternion rotation no espaço mundo

  • this.gameObject.worldScale é a scale vector3 no espaço mundo

A principal diferença a ter em mente aqui é que position no three.js é por padrão uma posição no espaço local, enquanto no Unity position seria no espaço mundo e usaria localPosition para usar deliberadamente a posição no espaço local. A próxima secção explicará como obter a posição no espaço mundo no three.js.

Posição, Rotação, Scale... no MUNDO

No three.js (e, portanto, também no Needle Engine), object.position, object.rotation, object.scale são todas coordenadas de espaço local. Isso é diferente do Unity, onde estamos acostumados a position ser no espaço mundo e usar localPosition para usar deliberadamente a posição no espaço local.

Se quiser aceder às coordenadas do mundo no Needle Engine, temos métodos de utilidade que pode usar com os seus objetos. Chame getWorldPosition(yourObject) para calcular a posição do mundo. Métodos semelhantes existem para rotação/quaternion e scale. Para ter acesso a esses métodos, importe-os simplesmente do Needle Engine assim: import { getWorldPosition } from "@needle.tools/engine"

Tempo

Use this.context.time para aceder aos dados de tempo:

  • this.context.time.time é o tempo desde que a aplicação começou a correr

  • this.context.time.deltaTime é o tempo que passou desde o último frame

  • this.context.time.frameCount é o número de frames que passaram desde que a aplicação começou

  • this.context.time.realtimeSinceStartup é o tempo não escalonado desde que a aplicação começou a correr

Também é possível usar this.context.time.timeScale para deliberadamente abrandar o tempo, por exemplo, para efeitos de slow motion.

Raycasting

Use this.context.physics.raycast() para realizar um raycast e obter uma lista de interseções. Se não passar nenhuma opção, o raycast é realizado a partir da posição do rato (ou primeira posição de toque) no espaço de ecrã usando a mainCamera atualmente ativa. Também pode passar um objeto RaycastOptions que tem várias configurações como maxDistance, a câmara a ser usada ou as layers a testar.

Note que as chamadas acima estão por padrão a fazer raycasting contra objetos visíveis na cena. Isso é diferente do Unity, onde precisa sempre de colliders para acertar em objetos. A solução padrão do three.js tem prós e contras, onde um dos principais contras é que pode ter um desempenho bastante lento dependendo da geometria da sua cena. Pode ser especialmente lento ao fazer raycasting contra skinned meshes. É, portanto, recomendado geralmente definir objetos com SkinnedMeshRenderers no Unity para a layer Ignore Raycast, que então serão ignorados por padrão pelo Needle Engine também.

Outra opção é usar os métodos de raycast da física, que só retornarão hits com colliders na cena.

const hit = this.context.physics.engine?.raycast();

Input

Use this.context.input para obter o estado de input:

import { Behaviour } from "@needle-tools/engine";
export class MyScript extends Behaviour
{
    update(){
        if(this.context.input.getPointerDown(0)){
            console.log("POINTER DOWN")
        }
    }
}

Também pode subscrever eventos na enum InputEvents assim:

import { Behaviour, InputEvents, NEPointerEvent } from "@needle-tools/engine";

export class MyScript extends Behaviour
{
    onEnable(){
        this.context.input.addEventListener(InputEvents.PointerDown, this.inputPointerDown);
    }
    onDisable() {
        // é recomendado também anular a subscrição de eventos quando o seu componente se torna inativo
        this.context.input.removeEventListener(InputEvents.PointerDown, this.inputPointerDown);
    }

    inputPointerDown = (evt: NEPointerEvent) => { console.log(evt); }
}
window.addEventListener("click", () => { console.log("MOUSE CLICK"); });

Note que neste caso, tem que lidar com todos os casos sozinho. Por exemplo, pode precisar de usar eventos diferentes se o seu utilizador estiver a visitar o seu website no desktop vs mobile vs um dispositivo VR. Estes casos são automaticamente tratados pelos eventos de input do Needle Engine (por exemplo, PointerDown é acionado tanto para mouse down, touch down e, no caso de VR, para controller button down).

Callbacks do InputSystem

Para que isto funcione, certifique-se de que o seu objeto tem um componente ObjectRaycaster ou GraphicRaycaster na hierarquia pai.

import { Behaviour, IPointerEventHandler, PointerEventData } from "@needle-tools/engine";

export class ReceiveClickEvent extends Behaviour implements IPointerEventHandler {
    onPointerClick(args: PointerEventData) {
        console.log("Click", args);
    }
}

Nota: IPointerEventHandler subscreve o objeto a todos os eventos de ponteiro possíveis. Os manipuladores para eles são:

  • onPointerDown

  • onPointerUp

  • onPointerEnter

  • onPointerMove

  • onPointerExit

  • onPointerClick

Todos têm um argumento PointerEventData que descreve o evento.

Debug.Log

O equivalente a Debug.Log() em javascript é console.log(). Pode também usar console.warn() ou console.error().

import { GameObject, Renderer } from "@needle-tools/engine";
const someVariable = 42;
// ---cut-before---

console.log("Hello web");
// Pode passar quantos argumentos quiser assim:
console.log("Hello", someVariable, GameObject.findObjectOfType(Renderer), this.context);

Gizmos

No Unity, normalmente tem que usar métodos especiais para desenhar Gizmos como OnDrawGizmos ou OnDrawGizmosSelected. No Needle Engine, por outro lado, tais métodos não existem e é livre para desenhar gizmos de qualquer lugar no seu script. Note que também é sua responsabilidade não desenhá-los, por exemplo, na sua aplicação web implementada (pode simplesmente filtrá-los por if(isDevEnvironment))).

Aqui está um exemplo para desenhar uma esfera de arame vermelha por um segundo, por exemplo, para visualizar um ponto no espaço mundo.

import { Vector3 } from "three";
const hit = { point: new Vector3(0, 0, 0) };
// ---cut-before---
import { Gizmos } from "@needle-tools/engine";
Gizmos.DrawWireSphere(hit.point, 0.05, 0xff0000, 1);

Aqui estão alguns dos métodos de gizmo disponíveis:

Nome do Método

Gizmos.DrawArrow

Gizmos.DrawBox

Gizmos.DrawBox3

Gizmos.DrawDirection

Gizmos.DrawLine

Gizmos.DrawRay

Gizmos.DrawRay

Gizmos.DrawSphere

Gizmos.DrawWireSphere

Métodos Utilitários Úteis

Importe de @needle-tools/engine, por exemplo, import { getParam } from "@needle-tools/engine"

Nome do Método
Descrição

getParam()

Verifica se existe um parâmetro de URL. Retorna true se existir mas não tiver valor (por exemplo, ?help), false se não for encontrado no URL ou for definido como 0 (por exemplo, ?help=0), caso contrário, retorna o valor (por exemplo, ?message=test)

isMobileDevice()

Retorna true se a app for acedida a partir de um dispositivo móvel

isDevEnvironment()

Retorna true se a app atual estiver a correr num servidor local

isMozillaXR()

isiOS

isSafari

import { isMobileDevice } from "@needle-tools/engine"
if( isMobileDevice() )
import { getParam } from "@needle-tools/engine"
// returns true
const myFlag = getParam("some_flag")
console.log(myFlag)

O projeto Web

Em C#, geralmente trabalha com uma solution contendo um ou muitos projetos. No Unity, esta solution é gerida pelo Unity para si, e quando abre um script C#, ele abre o projeto e mostra-lhe o ficheiro. Normalmente instala Packages usando o package manager built-in do Unity para adicionar funcionalidades fornecidas pelo Unity ou por outros developers (seja da sua equipa ou, por exemplo, via AssetStore do Unity). O Unity faz um excelente trabalho ao tornar a adição e gestão de packages fácil com o seu PackageManager, e talvez nunca tenha tido que editar manualmente um ficheiro como o manifest.json (isto é o que o Unity usa para rastrear quais packages estão instalados) ou executar um comando da linha de comandos para instalar um package.

Num ambiente web, usa npm - o Node Package Manager - para gerir dependências / packages para si. Ele faz basicamente o mesmo que o PackageManager do Unity - instala (faz download) packages de algum servidor (geralmente chamado de registry nesse contexto) e os coloca dentro de uma pasta chamada node_modules.

Aqui está um exemplo de como um package.json pode parecer:

{
  "name": "@optional_org/package_name",
  "version": "1.0.0",
  "scripts": {
    "start": "vite --host"
  },
  "dependencies": {
	  "@needle-tools/engine": "^3.5.9-beta",
	  "three": "npm:@needle-tools/three@0.146.8"
	},
  "devDependencies": {
	  "@types/three": "0.146.0",
	  "@vitejs/plugin-basic-ssl": "^1.0.1",
	  "typescript": "^5.0.4",
	  "vite": "^4.3.4",
	  "vite-plugin-compression": "^0.5.1"
	}
}

O nosso template padrão usa Vite como o seu bundler e não tem nenhum framework frontend pré-instalado. Needle Engine não tem opinião sobre qual framework usar, por isso é livre para trabalhar com o framework que preferir. Temos exemplos para frameworks populares como Vue.js, Svelte, Next.js, React ou React Three Fiber.

Instalar packages e dependências

Qual a diferença entre 'dependencies' e 'devDependencies'

Deve ter notado que existem duas entradas contendo dependency - dependencies e devDependencies.

dependencies são sempre instaladas (ou agrupadas) quando o seu projeto web é instalado ou em casos em que desenvolve uma biblioteca e o seu package é instalado como dependência de outro projeto.

devDependencies são apenas instaladas durante o desenvolvimento do projeto (o que significa que quando executa diretamente install na diretoria específica) e caso contrário não são incluídas no seu projeto.

Como instalo outro package ou dependência e como usá-lo?

Primeiro, execute npm install @tweenjs/tween.js no terminal e espere que a instalação termine. Isso adicionará uma nova entrada ao nosso package.json:

"dependencies": {
    "@needle-tools/engine": "^3.5.11-beta",
    "@tweenjs/tween.js": "^20.0.3",
    "three": "npm:@needle-tools/three@0.146.8"
}

Depois, abra um dos seus ficheiros de script em que quer usar tweening e importe no topo do ficheiro:

import * as TWEEN from '@tweenjs/tween.js';

Note que importamos aqui todos os tipos na biblioteca escrevendo * as TWEEN. Poderíamos também importar apenas tipos específicos como import { Tween } from @tweenjs/tween.js.

Para rodar um cubo, criamos um novo tipo de componente chamado TweenRotation, depois procedemos a criar a nossa instância de tween para a rotação do objeto, quantas vezes deve repetir, qual easing usar, o tween que queremos realizar e depois iniciamos. Temos apenas que chamar update a cada frame para atualizar a animação do tween. O script final parece assim:

import { Behaviour } from "@needle-tools/engine";
import * as TWEEN from '@tweenjs/tween.js';

export class TweenRotation extends Behaviour {

    // save the instance of our tweener
    private _tween?: TWEEN.Tween<any>;

    start() {
        const rotation = this.gameObject.rotation;
        // create the tween instance
        this._tween = new TWEEN.Tween(rotation);
        // set it to repeat forever
        this._tween.repeat(Infinity);
        // set the easing to use
        this._tween.easing(TWEEN.Easing.Quintic.InOut);
        // set the values to tween
        this._tween.to({ y: Math.PI * 0.5 }, 1000);
        // start it
        this._tween.start();
    }

    update() {
        // update the tweening every frame
        // the '?' is a shorthand for checking if _tween has been created
        this._tween?.update();
    }
}

Aprender Mais

Página traduzida automaticamente usando IA

Note que em alguns casos o tipo pode ser omitido. Isso pode ser feito para todos os . São eles: boolean, number, bigint, string, null e undefined.

Também pode usar métodos específicos do three.js para iterar rapidamente todos os objetos recursivamente usando o método :

ou para percorrer apenas objetos visíveis, use em vez disso.

Needle Engine faz uso intenso de um Sistema de Componentes que é semelhante ao do Unity. Isto significa que pode adicionar ou remover componentes a qualquer Object3D / GameObject na cena. Um componente será registado no engine ao usar addNewComponent(<Object3D>, <ComponentType>). Os métodos de evento que o componente anexado terá serão então automaticamente chamados pelo engine (por exemplo, update ou onBeforeRender). Uma lista completa de métodos de evento pode ser encontrada na .

this.gameObject.position é a posição vector3 no espaço local

this.gameObject.rotation é a no espaço local

this.gameObject.quaternion - é a no espaço local

this.gameObject.scale - é a vector3 no espaço local

Note que estes métodos de utilidade como getWorldPosition, getWorldRotation, getWorldScale internamente têm um buffer de instâncias de Vector3 e destinam-se a ser usados apenas localmente. Isso significa que não deve guardá-los em cache no seu componente, caso contrário, o seu valor em cache será eventualmente substituído. Mas é seguro chamar getWorldPosition várias vezes na sua função para fazer cálculos sem ter que se preocupar em reutilizar a mesma instância. Se não tiver a certeza do que isto significa, deve dar uma vista de olhos na secção Primitive Types no .

Use this.context.physics.raycastFromRay(your_ray) para realizar um raycast usando um .

Aqui está um .

Se quiser lidar com os inputs você mesmo, pode também subscrever (há imensos). Por exemplo, para subscrever o evento de clique do browser, pode escrever:

Semelhante ao Unity (veja ), também pode registar-se para receber eventos de input no próprio componente.

Ao trabalhar com um projeto web, a maioria das suas dependências são instaladas de . É o registry de packages mais popular para projetos web.

Para instalar uma dependência do npm, pode abrir o seu projeto web numa linha de comandos (ou terminal) e executar npm i <the/package_name> (abreviação para npm install) Por exemplo, execute npm i @needle-tools/engine para instalar . Isso adicionará então o package ao seu package.json no array dependencies. Para instalar um package apenas como devDependency, pode executar npm i --save-dev <package_name>. Mais sobre a diferença entre dependencies e devDependencies abaixo.

A secção ensinou-nos que pode instalar dependências executando npm i <package_name> na diretoria do seu projeto, onde package_name pode ser qualquer package que encontre em .

Vamos supor que quer adicionar uma biblioteca de tweening ao seu projeto. Usaremos para este exemplo. está o projeto final se quiser saltar à frente e apenas ver o resultado.

Agora podemos usá-lo no nosso script. É sempre recomendado consultar a documentação da biblioteca que quer usar. No caso do tween.js, eles fornecem um que podemos seguir. Geralmente, a página Readme do package no npm contém informações sobre como instalar e usar o package.

Agora só temos que adicioná-lo a qualquer um dos objetos na nossa cena para os rodar para sempre. Pode ver o script final em ação .

Guia Essencial de Typescript
abrir engine.needle.tools/new
three.js
visão
visão geral técnica
primitive types em Javascript
traverse
traverseVisible
position
euler rotation
quaternion rotation
scale
three.js ray
exemplo editável para raycast de física
todos os eventos que o browser fornece
IPointerClickHandler no Unity
npmjs.com
Needle Engine
@tweenjs/tween.js
Aqui
user guide
aqui
Scripting no Needle Engine
Essentials de Typescript
Referência de Componentes
npm.js
Instalar
Guia Essencial de Typescript
documentação de scripting