A tabela a seguir contém os decorators de Typescript disponíveis que o Needle Engine oferece.
Pode pensar neles como Atributos em esteróides (se estiver familiarizado com C#) - podem ser adicionados a classes, campos ou métodos em Typescript para fornecer funcionalidade adicional.
Decoradores de Campos e Propriedades | |
@serializable() | Adicionar a campos expostos / serializados. É usado ao carregar ficheiros glTF que foram exportados com componentes do Unity ou Blender. |
@syncField() | Adicionar a um campo para sincronizar o valor na rede quando muda. Pode passar um método a ser chamado quando o campo muda. |
@validate() | Adicionar para receber callbacks no método de evento do componente onValidate sempre que o valor muda. Isto comporta-se de forma semelhante ao onValidate do Unity. |
Decoradores de Métodos | |
@prefix(<type>) (experimental) | Pode ser usado para injetar código personalizado noutros componentes. Opcionalmente, retornar false para impedir que o método original seja executado. Veja o exemplo abaixo. |
Decoradores de Classes | |
@registerType | Sem argumento. Pode ser adicionado a uma classe de componente personalizada para ser registada nos tipos do Needle Engine e para ativar o suporte a hot reloading. |
Exemplos
Serializable
import { Behaviour, serializable, EventList } from "@needle-tools/engine";
import { Object3D } from "three";
export class SomeComponentType extends Behaviour {}
export class ButtonObject extends Behaviour {
// you can omit the type if it's a primitive
// e.g. Number, String or Bool
@serializable()
myNumber: number = 42;
// otherwise add the concrete type that you want to serialize to
@serializable(EventList)
onClick?: EventList;
@serializable(SomeComponentType)
myComponent?: SomeComponentType;
// Note that for arrays you still add the concrete type (not the array)
@serializable(Object3D)
myObjects?: Object3D[];
}
SyncField
O decorator @syncField
pode ser usado para sincronizar automaticamente propriedades dos seus componentes na rede para todos os utilizadores (visitantes do seu site) conectados à mesma sala de networking. Opcionalmente, pode receber uma função de callback que será invocada sempre que o valor mudar.
- Para notificar o sistema que um valor de referência (como um objeto ou array) mudou, precisa de reatribuir o campo. Por exemplo, assim:
myField = myField
- A função de callback não pode ser uma arrow function (por exemplo,
MyScript.prototype.onNumberChanged
funciona paraonNumberChanged() { ... }
, mas não funciona paramyNumberChanged = () => { ... }
)
import { Behaviour, serializable, syncField } from "@needle-tools/engine";
export class MyScript extends Behaviour {
@syncField(MyScript.prototype.onNumberChanged)
@serializable()
myNumber: number = 42;
private onNumberChanged(newValue: number, oldValue: number){
console.log("Número mudou de ", oldValue, "para", newValue)
}
}
Validate
import { Behaviour, serializable, validate } from "@needle-tools/engine";
export class MyScript extends Behaviour {
@validate()
@serializable()
myNumber?: number;
start() { setInterval(() => this.myNumber = Math.random(), 1000) }
onValidate(fieldName: string) {
console.log("Validate", fieldName, this.myNumber);
}
}
Prefix
import { Camera, prefix } from "@needle-tools/engine";
class YourClass {
@prefix(Camera) // < este é o tipo que tem o método que quer mudar
awake() { // < este é o nome do método que quer mudar
// isto é agora chamado antes do método Camera.awake executar
// NOTA: `this` refere-se agora à instância da Camera e NÃO mais a `YourClass`. Isto permite-lhe aceder também ao estado interno do componente
console.log("Olá câmera:", this)
// opcionalmente, retorne false se quiser impedir o comportamento padrão
}
}
Página traduzida automaticamente usando IA