Asignación de diseño y programación de juegos 3D 6

Mejora el juego OVNI (Hit UFO)

Reclamación

  1. Modifica el juego de platillo volador de acuerdo con el dibujo de diseño del modo adaptador
  2. Haz que sea compatible con el movimiento físico y el movimiento cinemático (transformación).

lograr

Proyecto original: Programación 3D y Diseño de Juegos Tarea 5 Solo
se puede realizar cambiando algunas de las clases.

Preajuste OVNI

Debido al requisito de soportar el movimiento físico, la configuración predeterminada del platillo volante debe agregar un cuerpo rígido a la base original:
Inserte la descripción de la imagen aquí

Implementación del adaptador

El adaptador selecciona diferentes interfaces a través de diferentes estados. En esta asignación, se seleccionan diferentes métodos de implementación de acciones (físico / cinemático). Se encuentra que la función es similar al flyActionController anterior, por lo que se reescribe como Adaptador:

public class Adapter : SSActionManager {
    public DiskFlyAction fly;
    public PhysisFlyAction fly_;

    public void DiskFly(GameObject disk, int mode, mes information) {
        int leftOrRight = 1;
        if (disk.transform.position.x > 0){
            leftOrRight = -1;
        }

        if(mode == 2){
            fly = DiskFlyAction.GetSSAction(leftOrRight, information.angle, information.speed);
            this.StartAction(disk, fly);
        }
        else{
            fly_ = PhysisFlyAction.GetSSAction(leftOrRight, information.speed);
            this.StartAction(disk, fly_);
        }
    }
}

Controle el tipo de movimiento a través del modo, y luego llame a DiskFlyAction y PhysisFlyAction respectivamente. La información utilizada aquí es un tipo personalizado para almacenar información relacionada.

public struct mes{
    public float speed;
    public float angle;
}

PhysisFlyAction && SSAction && DiskFlyAction

La clase PhysisFlyAction, el código es el siguiente:

public class PhysisFlyAction : SSAction
{
    private bool start_position;
    public float force;

    public static PhysisFlyAction GetSSAction(int pos, float force_){
        PhysisFlyAction action = CreateInstance<PhysisFlyAction>();
        if(pos == 1){
            action.start_position = true;
        }
        else{
            action.start_position = false;
        }
        action.force = force_;
        
        return action;
    }
    // Start is called before the first frame update
    public override void Start()
    {
        Rigidbody disk = gameobject.GetComponent<Rigidbody>();
        
        gameobject.GetComponent<Rigidbody>().useGravity = true;
        if(gameobject.GetComponent<Rigidbody>().position.y <= 3){
            if(start_position){
                gameobject.GetComponent<Rigidbody>().AddForce(new Vector3(0.4f,0.2f,0)*force*15f, ForceMode.Impulse);
            }
            else{
                gameobject.GetComponent<Rigidbody>().AddForce(new Vector3(-0.4f,0.2f,0)*force*15f, ForceMode.Impulse);
            }
        }
    }

    // Update is called once per frame
    public override void Update()
    {
        
    }

    public override void FixedUpdate() {
        if (transform.position.y <= -10f) {
            Debug.Log(transform.position.y);
            gameobject.GetComponent<Rigidbody>().useGravity = false;
            gameobject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
            this.enable = false;
        }
    }
}

La implementación general es similar al movimiento físico, pero FixedUpdate se usa aquí.
Los pequeños detalles de este tipo de diseño tienen cambios en la gravedad. Al principio, la gravedad se activa. Bajo la acción de una fuerza inicial y la gravedad, el platillo volante hace un movimiento de proyectil. Cuando el platillo volante se mueve fuera de la línea de visión de nuestra cámara (aquí está FixedUpdate) Cuando se menciona -10f), la gravedad se apaga. Porque si no se apaga la gravedad, el platillo volante seguirá cayendo, y luego tendrá una gran velocidad cuando DiskFactory lo recicle para el próximo uso, lo que afectará la experiencia del juego, como se muestra en la figura siguiente (puede ver que el tercer platillo volante verde aparece en la esquina inferior derecha Tiene una velocidad vertical muy grande cuando pasa parpadeando):
Inserte la descripción de la imagen aquí

Dado que physic agrega FixedUpdate, SSAction y DiskFlyAction también agregan un FixedUpdate vacío:

public class SSAction : ScriptableObject {
	……    
    public virtual void FixedUpdate() {
        throw new System.NotImplementedException();
    }
    ……
}

public class DiskFlyAction : SSAction {
	……
    public override void FixedUpdate() {
        
    }
    ……
}

FirstController && Interfaces

Los cambios de FirstController son los siguientes:
se agrega una variable bool para registrar si es un movimiento físico o un movimiento de transformación cinemática. Para cambiar esta variable a través de UserGUI, se agrega una función setPhysic, y al mismo tiempo, se agrega a Interfaces para facilitar la modificación de UserGUI.

private bool physic = false;
……
public void setPhysic(bool physic_){
	physic = physic_;
}

SSActionManager

Aumentar FixedUpdate:

……
if (action.enable) {
    	action.Update();
    	action.FixedUpdate();
} 
……

UserGUI

Se agregan dos botones a la primera interfaz para seleccionar si está en modo físico.


efecto

Modo físico: el
Inserte la descripción de la imagen aquí
modo cinemático original sigue funcionando normalmente:
Inserte la descripción de la imagen aquí

Código fuente:

GitHub

Supongo que te gusta

Origin blog.csdn.net/Floating__dust/article/details/109633997
Recomendado
Clasificación