Cómo usar unity3d para escribir javascript
0. Conceptos básicos:
Unity3d puede vincular objetos del juego, modificar valores de variables y obtener una vista previa de los efectos modificados del juego en tiempo real en scripts, ahorrando muchos ajustes de script y tiempo de depuración. Se mejora y se mejora la eficiencia del desarrollo.
JS se utiliza tanto en proyectos simples como en numerosos ejemplos y paquetes de recursos de scripts en Unity. Los proyectos comerciales utilizan básicamente C# porque C# es fácil de interactuar con C++. La rica estructura de datos y la arquitectura orientada a objetos favorecen la escritura de programas a gran escala. Muchos complementos potentes de terceros se desarrollan en C#, lo que facilita la creación de programas a gran escala. flujo de trabajo.
Proceso de compilación:
El entorno de ejecución de UnityScript utiliza .NET Framework de Mono. De hecho, UnityScript se implementa utilizando Boo, un lenguaje que se ejecuta en la máquina virtual Mono y se compila en código nativo. Mono proporciona muchos entornos de ejecución típicos para JavaScript, como las bibliotecas String y Math. Puede comprender por qué los nombres de los métodos en UnityScript están todos en mayúsculas, ya que deben ser iguales que los nombres de los métodos en Mono.
Los scripts en Unity se diferencian de los lenguajes interpretados tradicionales (interpretados por JIT) en que están compilados, por lo que todos son igualmente rápidos.
El código en los tres lenguajes eventualmente se compilará y ejecutará, y los scripts podrán acceder entre sí.
Llamada a biblioteca:
Los scripts de Unity se basan en la plataforma .net de Mono. Todos los scripts pueden usar bibliotecas .net. Estas bibliotecas proporcionan buenas soluciones para xml, bases de datos y expresiones regulares.
Para llamar a la biblioteca .net de mono, Unity js puede importarla directamente.
importar Sistema;
importar System.IO;
De lo contrario, debe especificar el espacio de nombres completo de la función que llama, como System.IO.File .Open() en lugar de File.Open().
1. Tipos y declaraciones básicos:
1) Tipo de datos:
Tipo de número: char, byte, sbyte; short, ushort, int, uint, long,ulong; float, double; decimal.
Tipo booleano: booleano
Cadena: cadena, símbolo [índice]
Cadena [0] es la cadena etiquetado como 0 a continuación.
var s: String = "Whatever_it_may_be";
s =s.Replace("_"[0], " "[0]); // Reemplaza todos los guiones bajos con espacios
2) Declaración de variables:
Las variables deben declararse primero (obligatorio) (por razones de compilación, declarar tipos es útil para reducir el exceso de constantes y evitar pérdidas de memoria), y luego puede Defina el tipo (opcional):
var playerName:String;
Los parámetros de función también deben declararse como tipos:
function Test( playerName :String, baseInfo : Objeto )
{
}
Si un tipo se define o asigna en el momento de la declaración, no se puede cambiar a menos que el tipo no esté definido en el momento de la declaración. .
var a= "prueba";
a =5;//Error
var a;
a = "prueba" ;
a =5;//Correcto
Las variables pueden tener el prefijo público, protegido o privado; público no se utiliza de forma predeterminada.
3) Matriz:
Matriz personalizada incorporada (función rápida y simple):
valores var: int[] = {1,2,3 };
Convertir a matriz de matriz (es necesario procesar la matriz), var arr = new Array(values);
Matriz de objetos de matriz (función de clasificación y fusión de crecimiento dinámico lento):
var arr = new Array(); arr.Push("good");
Convertir a matriz integrada (cuando se requiere un mayor rendimiento), var bArray : int[] = arr.ToBuiltin(int );
4) Listas vinculadas y genéricos:
UnityScript puede usar genéricos, por lo que cuando se trata de matrices de tamaño dinámico, es mejor usar Lista en lugar de Array; básicamente no hay razón para usar Array cuando List es más rápido y versátil. Si necesita una variedad de tipos mixtos, puede usar una lista de objetos. La sintaxis de resumen en UnityScript es similar a la de C#, excepto que hay un símbolo "." adicional antes de "<>". Por ejemplo, "varmyList = new List
5) Operadores y expresiones:
Igual que C#.
6) Declaración:
Se debe escribir un punto y coma en cada línea; al atravesar elementos del objeto, for(var i:int = 0; i < 10; i++) es mejor que C# muchos.
el conmutador puede utilizar variables de cadena.
2. Función
Reglas de declaración:
función nombre de función (parámetro1: tipo de parámetro, parámetro2: tipo de parámetro...): tipo de valor de retorno p> p>
{
}
Las funciones en unityScript pueden considerarse objetos de tipo Función y pueden usarse para operaciones de asignación y comparación como variables.
No se pueden escribir funciones anónimas.
Las matemáticas necesitan ser Mathf.
3. Clase (no hay clase en DOM js):
En Unity, un archivo js es una clase y el motor de Unity generará automáticamente una clase para el archivo js. .
Para los scripts de UnityScript, cuando Unity compila el archivo, agregará automáticamente una clase al script con el mismo nombre que el archivo del script y heredará automáticamente MonoBehaviour, pero para C# o Boo, debe escribir explícitamente en el script Nombres de clases y relaciones de herencia. Para crear una clase que no herede de MonoBehaviour, use C# o agregue un recurso de script js desde afuera (puede crear un nuevo objeto usted mismo).
//SayHello.js
#pragma estricto // Comprobación de tipo estricta, generación de errores por adelantado, desactivación del tipo dinámico, forzando el tipo estático (tipo fuerte)
función decirHola()
{
}
Equivalente en C#:
#pragma estricto
público la clase SayHello extiende MonoBehaviour
{
función sayHello()
{
}
}
}
Sin embargo, puede declarar varias clases en el mismo archivo, lo cual es especialmente útil si necesita utilizar algunas clases auxiliares que normalmente no heredan de MonoBehaviour.
Por ejemplo:
class ButtonState {
var currentState: int
var offset: Vector2;
}
Si declaras una subclase de MonoBehaviour en un archivo y el nombre de la clase es inconsistente con el nombre del archivo, incluso por las dudas, tendrás problemas.
Es importante entender que cuando escribes un script de comportamiento en un archivo js, en realidad estás escribiendo una clase:
a) Clase y sus objetos: el nombre del archivo es The nombre de la clase, si el nombre del archivo es foo.js, puede llamarlo en otro lugar en el formulario var x = new foo();
b) Métodos de clase y métodos predefinidos: hay algunos métodos específicos Puede implementar controladores de eventos predefinidos por el sistema, como Inicio, Actualización fija, etc. Las funciones declaradas en cualquier caso son métodos de la clase representada por el archivo.
c) Atributos de clase: el código escrito fuera de la definición de función en el archivo se ejecuta dentro del alcance de la clase, y las variables declaradas también son miembros de la clase. Las funciones y variables estáticas de una clase son esencialmente métodos y propiedades de la clase.
Ejemplo:
/*Cuando arrastras el comportamiento al objeto del juego, los valores serán visibles y editables
*/ p>
nombre público: Cadena;
/*Otros scripts que tienen referencias al objeto (por ejemplo, si estos scripts están adjuntos al objeto del juego, entonces estos scripts serán visibles y editables
*).
*/
nombre público: String;*/ publicage: int;
/*los miembros privados no son visibles para otros scripts, incluso si hacen referencia a este objeto
*/
private favoritoColor:Color;
/* Puedes crear un mejor amigo para mejor amigo arrastrando un objeto de juego con una copia del comportamiento foo adjunto. esta propiedad Cesión. Esto le dará acceso a los miembros y métodos públicos de bestFriend
*/
public bestFriend: foo;
/*Unity llamará a esta función en cada cuadro, por lo que en realidad es un controlador de eventos
*/
función Update(){
/*transform es una propiedad heredada de gameObject, su comportamiento es el mismo que el de gameObject.
thegameObject al que está adjunto el comportamiento*/
var t = transform;
}
function Bar(){
// this Solo una función, si no la llamas tú mismo, nunca hará nada
}
4. Herencia
En Unity necesitas usar extends Palabras clave:
clase MyHello extiende Hello
{
}
El prototipo DOM js contiene el método bind().
Unityjs también proporciona funciones virtuales.
La herencia de clases también es diferente. En JavaScript y C#, los métodos están implícitos y no se pueden sobrecargar a menos que se agregue la palabra clave virtual a la declaración del método. La diferencia es que C# solo sobrecarga los métodos que contienen la palabra clave override. JavaScript no requiere esta palabra clave, solo necesita sobrecargar el método de clase sobrecargado y todo lo demás se puede heredar.
//Foo.js
var foo = "hola, mundo";
función doEet () {
// hace nada, destinado a ser anulado
}
generará:
//Foo.js
función doEet ( ) {
// no.js
importa UnityEngine;
classFoo extiende MonoBehaviour {
public var foo = "hola, world";
función pública doEet () {
// no hace nada, está destinado a ser anulado
}
} p>
Subclase de escritura:
//PrintingFoo.js
clase PrintingFoo extiende Foo {
función doEet() {
print( foo );
}
}
Creando funciones virtuales:
classFoo
{
función virtual DoSomething ()
{
Debug.Log("de la clase base");
}
}
}
//SubFoo.js
clase SubFoo extiende Foo
{
función virtual DoSomething()
{
Debug.Log("de la subclase");
}
}
}
/Elsewhere
varfoo : Foo = new SubFoo();
foo.
clase SubFoo extiende Foo
{
Función virtual DoSomething()
{
super.DoSomething();// No es una función virtual, debería poder ser se llama directamente sin el modificador super.
Si desea llamar a un método de la clase principal, utilice la palabra clave super.
Debug.Log("de la subclase");
}
}
/Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//imprime "de la clase base" y "de la subclase"
Comunicación entre clases: utilice un El método (relación de asociación) está mucho menos acoplado que la herencia y es fácil de modificar y mantener
/*Foo.js */
varbar: Bar;
función Inicio() {
barra = gameObject.GetComponent(Bar);
}
función doEet(){
// hacer lo mío
if( bar ){
bar.doEet();