Script d'unité (3)

Tutoriel vidéo : https://www.bilibili.com/video/BV12s411g7gU?p=128 

Table des matières

Temps

Préfabriqué 

Animation


Temps

Time.time : L'heure de début de chaque image depuis le démarrage de l'application (lecture seule)  

Time.deltaTime : L'intervalle entre chaque image, ou le temps nécessaire pour terminer une image (égal à Time.time de l'image actuelle-Time.time de l'image suivante)

public float speed=100;

void Update()
{
        transform.Rotate(0,speed*Time.deltaTime,0);
        //旋转/移动速度*每帧间隔,以保证旋转/移动速度不受渲染影响
}

Time.timeScale : mise à l'échelle du temps, peut être utilisée pour des effets de ralenti ou pour accélérer l'application

ps : lorsqu'il est défini sur 1,0, la vitesse du temps qui passe est aussi rapide que le temps réel ; lorsqu'il est défini sur 0,5, le temps est 2 fois plus lent que le temps réel 

Time.unscaledTime : intervalle par image non mis à l'échelle

//渲染时执行,不受TimeScale影响
void Update()
{
    //transform.Rotate(0, speed * Time.deltaTime, 0);
}

//固定0.02s执行一次,与渲染无关,受TimeScale影响
void FixedUpdate()
{
    //this.transform.Rotate(0, speed * Time.fixedDeltaTime, 0);
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

Bien que l'exécution de Update ne soit pas affectée par timeScale, la méthode Transform.Rotate écrite dans Update sera toujours affectée par timeScale après l'exécution. En effet, Time.deltaTime est affecté par timeScale. Si vous modifiez le code sans multiplier Time.deltaTime , puis appuyez sur "Pause Game" pour arrêter l'objet de tourner

transform.Rotate(0, speed, 0);

Faire en sorte que certains objets de la scène ne soient pas affectés par "Pause"

public float speed = 100;

void Update()
{
        transform.Rotate(0, speed * Time.unscaledTime, 0);     
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

Time.frameCount : Le nombre total d'images depuis le début du jeu (lecture seule)

Time.realtimeSinceStartup : Temps réel depuis le début du jeu (lecture seule)

Vous pouvez utiliser le code suivant pour comprendre la différence entre Time.timeScale, Time.unscaledTime et Time.realtimeSinceStartup. Après l'exécution, cliquez sur le bouton "Pause Game", vous pouvez constater qu'à l'exception de la variable a, les valeurs des autres variables s'accumulent toujours

public float a;
public float b;
public float c;

void Update()
{
    a=Time.time;
    b=Time.unscaledTime;
    c=Time.realtimeSinceStartup;
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

Une horloge qui change toutes les 1 seconde

Difficulté : l'exécution de Update étant affectée par le rendu, l'intervalle de temps de chaque image est différent (mais généralement toujours autour de 0,02)

méthode 1 :

private float nextTime = 1;

void Update()
{
    if (Time.time >= nextTime)
    {
        second--;
        textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
        nextTime = Time.time + 1;
    }
}

Méthode 2 :

private float totalTime = 1;

void Update()
{
    totalTime+=Time.deltaTime;
    if (totalTime>1)
    {
        second--;
        textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
        totalTime-=1;
    }
}

 Méthode 3 :

void Start()
{
    textTimer = GetComponent<TMP_Text>();
    InvokeRepeating("Timer", 1, 1);
}

void Timer()
{
    if (second <= 0)
    {
        CancelInvoke("Timer");
    }
    second--;
    textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
}

MonoBehaviour.InvokeRepeating ( string methodName, float time, float repeatRate) : Invoquer la méthode methodName après le temps secondes, puis toutes les repeatRate secondes

methodName nom de la méthode à appeler
temps Commencer à appeler après n secondes
taux de répétition Répétez toutes les n secondes.

MonoBehaviour.CancelInvoke : annule tous les appels Invoke sur ce MonoBehaviour, ou annule tous les appels Invoke nommés methodName sur ce comportement

Préfabriqué 

Un type de ressource qui peut être instancié plusieurs fois dans une scène. Et la modification du préfabriqué peut être synchronisée avec toutes les instances, améliorant ainsi l'efficacité du développement. Si la valeur d'attribut de l'instance est modifiée séparément, la valeur ne changera plus avec le préfabriqué 

Faites glisser l'objet de jeu du panneau Hiérarchie vers le panneau Projet

 

Ouvrir : ouvrir le préfabriqué dans la scène 

Sélectionner : sélectionnez le préfabriqué correspondant via l'instance de préfabriqué

Revert All : abandonne la modification de la valeur de l'attribut d'instance et restaure la valeur de l'attribut préfabriqué

Appliquer tout : appliquer la modification d'une instance au préfabriqué et à toutes les autres instances

Animation

Animation.CrossFade : Fondu dans l'animation nommée nom et faire disparaître les autres animations pendant une certaine période de temps

Animation.Play : Lit l'animation sans aucune fusion

Animation.PlayQueued : joue l'animation suivante directement après la fin de la lecture de l'animation précédente (joue les animations une par une dans la séquence spécifiée)

étapes d'enregistrement

1. Cliquez sur le bouton d'enregistrement pour commencer à enregistrer l'animation

2. Ajouter une image clé Ajouter une propriété, sélectionner le type de composant

3. Sélectionnez l'image clé et ajustez le point temporel

4. Définissez les propriétés dans le panneau Scène ou Inspecteur

5. Cliquez sur le bouton d'enregistrement pour terminer l'enregistrement de l'animation

Créer une animation de porte

Utilisez un cube (base) comme modèle de la porte dans la scène, utilisez un objet vide (porte) comme axe de rotation de la porte et faites-en le parent de l'ancien

 

 Ajustez la position de l'objet vide (Porte) afin que son axe Z coïncide avec l'axe de rotation de la porte

  

Sélectionnez l'objet de jeu Porte et entrez Fenêtre-->Animation-->Animation pour créer une animation nommée Porte, cliquez sur le point rouge dans le coin supérieur gauche pour entrer en mode d'enregistrement ; cliquez sur Ajouter une propriété pour sélectionner la propriété Rotation sous Transformer ( cliquez sur le signe + à droite)

Après avoir ajouté les propriétés correspondantes, la longueur d'animation par défaut est de 0 : 00 à 1 : 00. Vous pouvez faire glisser l'image clé à la fin vers la position appropriée pour modifier la longueur de l'animation, ou appuyer sur le bouton droit dessus pour supprimer l'image clé à la fin (image clé Cliquez avec le bouton droit pour sélectionner Supprimer la clé), double-cliquez pour ajouter une nouvelle image clé à la position appropriée (ou cliquez avec le bouton droit sur la chronologie appropriée pour sélectionner Ajouter une clé)

 

Revenez au panneau Inspecteur pour constater que la zone d'affichage de l'attribut correspondant est rouge. Dans le cas de la sélection de l'image de fin de la chronologie, définissez la valeur Y de Rotation sur 90 (sélectionnez 90 degrés autour de l'axe Y)

ps : si l'animateur est généré, désinstallez le composant et montez le composant d'animation, puis définissez-le conformément à la figure ci-dessus ; assurez-vous de monter le composant de collision Box Collider et cliquez sur Modifier le collisionneur pour ajuster la boîte de configuration, sinon OnMouseDown() dans le script ci-dessous ne prendra pas effet

Vous pouvez choisir les courbes ci-dessous pour afficher les détails de l'animation

Écrivez le script Door et montez-le sur l'objet de jeu Door

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Door : MonoBehaviour
{
    public bool isOpen = false;
    public string animName;
    private Animation anim;

    private void Start()
    {
        anim = GetComponent<Animation>();
    }

    private void OnMouseDown()
    {
        if (isOpen)
        {
            if (anim.isPlaying == false)
            {
                anim[animName].time = anim[animName].length;
            }
            anim[animName].speed = -1;

        }
        else
        {
            anim[animName].speed = 1;

        }
        anim.Play(animName);
        isOpen = !isOpen;
    }
}

Animation.isPlaying : indique si l'animation en cours est en cours de lecture

Animation.time : l'heure actuelle de l'animation

Animation.length : la longueur de l'animation

ps : pour la nouvelle version qui n'utilise pas Animator pour contrôler l'animation, les paramètres suivants doivent être définis, sinon un avertissement apparaîtra

L'AnimationClip 'Door' utilisé par le composant Animation 'Door' doit être marqué comme Legacy

Après avoir sélectionné le mode Débogage dans le menu en haut à droite du panneau Inspecteur, cochez Legacy 

  

 

Mode Enveloppe

Mode d'habillage, qui détermine comment traiter après la fin de l'animation  

Par défaut par défaut : utilise la méthode de traitement dans le clip d'animation

Once play once : s'arrêter après avoir joué jusqu'à la fin

Lecture en boucle en boucle : jouez jusqu'à la fin puis recommencez à jouer

Lecture de ping-pong PingPong : jouer à l'envers après avoir joué jusqu'à la fin

Clamp Forever Fixe permanent : joue toujours la dernière image après avoir joué jusqu'à la fin

Je suppose que tu aimes

Origine blog.csdn.net/qq_53401568/article/details/128508849
conseillé
Classement