Imaginen que tenemos un cañon estatico, o una ametralladora de un avion que cambia su posición y rotación. Cuando presionamos click en el mouse o presionamos la barra espaceadora el cañon o cañones disparan. El proyectil debe tener la rotación del cañon y la posición.
Entonces en la escena debemos tener un cañon, en la punta del cañon un empty gameobject que va a funcionar como spawner, deben tener creado un prefab para instancearlo.
El código del cañon estático en el suelo, el cual rota sobre su eje:
public sealed class Canon : Component {
[Property] public float VelocidadMovimiento {get; set;} = 100f;
protected override void OnUpdate()
{
if(Input.Down("left")){
float rotationZ = WorldRotation.Angles().roll;
if(rotationZ > -85.14){
WorldRotation *= Rotation.From(0,0, -VelocidadMovimiento * Time.Delta);
}
}
if(Input.Down("right")){
float rotationZ = WorldRotation.Angles().roll;
if(rotationZ < 85.14){
WorldRotation *= Rotation.From(0, 0, VelocidadMovimiento * Time.Delta);
}
}
}
}
Luego el empty gameobject en la punta del cañon que funciona como el spawner de los proyectiles debe hacer una instancia del proyectil, luego tomar la posición y rotación del spawner.
public sealed class Spawner : Component {
[Property] PrefabFile Proyectil {get; set;}
protected override void OnUpdate()
{
if(Input.Pressed("jump")){
GameObject ProyectilInstance = GameObject.Clone(Proyectil);
ProyectilInstance.WorldPosition= WorldPosition;
ProyectilInstance.WorldRotation = WorldRotation;
}
}
}
Finalmente en el componente de script de nuestro prefab podríamos tener algo asi:
public sealed class ProyectilScript : Component {
[Property] public float PoderDeFuego {get; set;} = 1000f;
protected override void OnUpdate()
{
Vector3 Direccion = WorldRotation.Up;
WorldPosition += Direccion * PoderDeFuego * Time.Delta;
}
}
Dependiendo de la dirección inicial del cañon la dirección podria ser forward. Esto es un mini ejemplo de como instancear cosas y que tenga la misma posición y rotación del spawner.