Tutoriel vidéo : https://www.bilibili.com/video/BV12s411g7gU?p=128
Table des matières
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