View difference between Paste ID: ux7kYTY7 and n1twfRpB
SHOW: | | - or go back to the newest paste.
1
// all'inizio dobbiamo specificare quali librerie usare
2
// come vedete in grigio sono librerie che abbiamo specificato ma NON abbiamo utilizzato
3
using System.Collections;
4
using System.Collections.Generic;
5
using UnityEngine;
6
7
// ogni programma C# definisce UNA classe, il nome minuscolo/maiuscolo deve coincidere con il nome
8
// del file. In questo caso il file che contiene questo testo DEVE chiamarsi Player.cs
9
// MonoBehaviour e' un pezzo di UnityEngine che SA come gestire le funzionalita' dei GameObject
10
// nel nostro esempio noi utilizzeremo le callback Start, FixedUpdate 
11
// useremo override quando le callback hanno gia' una implementazione in MonoBehaviour
12
//           nostra classe
13
//           v        classe di Unity Engine
14
//           v        v
15
public class Player : MonoBehaviour
16
{
17
    #region parameters
18
    // i parametri PUBLIC si vedranno nell'inspector
19
    [Header("Impostazione velocita' movimento")]
20
    public float speed = 10;
21
    [Header("Impostazione sensibilita' mouse")]
22
    public float mousesensitivity = 3;
23
    [Header("Qui dovete trascinare la camera")]
24
    public GameObject fpsCamera;
25
    private Animator m_Animator;
26
    #endregion
27
    #region variables
28
    private Rigidbody rb;
29
    // contiene l'angolo corrente di inclinazione della camera
30
    // che viene modificato dal mouse up and down
31
    private float currentCameraUpRot = 0;
32
    #endregion
33
34
    void Start()
35
    {
36
        // questo script deve essere messo nel gameobject in cui abbiamo messo il componente rigidbody
37
        // ecco perche' questa funzione riesce a trovare il rigidbody associato
38
        rb = this.GetComponent<Rigidbody>();
39
        m_Animator = GetComponent<Animator>();
40
        
41
    }
42
43
   
44
    // FixedUpdate da usarsi per i movimenti che includono interazioni fisiche
45
    // Update quando solo la parte di rendering visuale e' coinvolta (no rigid body)
46
    private void FixedUpdate()
47
    {
48
        MovePlayer();
49
        RotatePlayer();
50
        UpDownCamera();
51
       
52
    }
53
54
    // gestione del movimento con AWSD o freccie
55
    // W o ^ per muovere su z+ (avanti) senso positivo freccia blu
56
    // S o v per muovere su z- (indietro)
57
    // A o < per muovere su x- (sinistra)
58
    // D o > per muovere su x+ (destra) senso positivo freccia rossa
59
    private void MovePlayer()
60
    {
61
        float x = Input.GetAxis("Horizontal"); // AD o <>
62
        float z = Input.GetAxis("Vertical"); // WS o ^v
63
64
        // applica orizzontale su destra sinistra sinistra = valori negativi
65
        // transform right e' il vettore "rosso" locale che tiene conto della posizione del player
66
        Vector3 HorizontalMovement = transform.right * x;
67
        // applica verticale per avanti indietro avanti = valore positivi
68
        // transform forward e' il vettore "blu" locale che tiene conto della posizione del player
69
        Vector3 VerticalMovement = transform.forward * z;
70
71
        // calcola movimento complessivo
72
        Vector3 movement = (HorizontalMovement + VerticalMovement);
73
74
        // solo se c'e' qualcosa da muovere
75
        if (movement != Vector3.zero)
76
        {
77
            // normalizza su un vettore lungo esattamente 1
78
            // nel caso in cui ci siano movimenti contemporanei fa in modo che sia
79
            // sempre lineare
80
            movement.Normalize();
81
82
            // applica movimento tenendo conto
83
            // * della velocita' impostata nell'inspector
84
            // * del fixedDeltaTime che serve a "normalizzare" il movimento in modo da renderlo fluido.
85
            rb.MovePosition(rb.transform.position + movement * Time.fixedDeltaTime * speed);
86
87
            // animation
88
            float m_TurnAmount = Mathf.Atan2(movement.x, movement.z);
89
            float m_ForwardAmount = movement.z;
90
            m_Animator.SetFloat("Forward", 1f, 0.1f, Time.fixedDeltaTime);
91
            // end animation
92
            
93
        } else
94
        {   // animation
95
            m_Animator.SetFloat("Forward", 0f, 0.1f, Time.fixedDeltaTime);
96
            m_Animator.SetFloat("Turn", 0f, 0.1f, Time.fixedDeltaTime);
97
            // end animation
98
        }
99
100
        
101
    }
102
103
    // gestione della rotazione del giocatore (mouse sinistra / destra)
104
    private void RotatePlayer()
105
    {
106
        // ottiene il valore di scostamento del mouse - per sx + per destra
107
        float mx = Input.GetAxis("Mouse X");
108
109
        // la rotazione deve essere applicata all'asse Y verticale il secondo numero
110
        // mouse sensitivity serve per poter controllare la velocita' di rotazione del player
111
        Vector3 rotation = new Vector3(0, mx, 0) * mousesensitivity;
112
113
        // in matematica aggiungere una rotazione ad una rotazione gia' presente
114
        // [ le rotazioni vengono rappresentate da Quaternioni, ma noi usiamo una rappresentazione
115
        // detta "di Eulero" che e' piu' semplice in cui si indicano i gradi di rotazione attorno 
116
        // agli assi X, Y, Z dove Y e' la rotazione che ci interessa.
117
        // dobbiamo quindi convertire il valore precedente rotation che era espresso in termini
118
        // di Eulero in modo che sia una rotazione valida. Ecco perche' lo trasformiamo in Quaternione]
119
        rb.MoveRotation(rb.transform.rotation * Quaternion.Euler(rotation));
120
        // animation
121
        m_Animator.SetFloat("Turn", mx, 0.1f, Time.fixedDeltaTime);
122
        // end animation
123
124
    }
125
126
    // gestiamo la rotazione che in termine tecnico si chiama "tilt" che indica la pendenza
127
    // usiamo il mouse lungo la direzione verticale in alto alza la telecamera = riduce il tilt
128
    // per questo motivo mettiamo -= updown
129
    // ci memorizziamo un angolo di partenza currentCameraUpRot che poi andremo a modificare
130
    // ottenendo l'angolo Euleriano
131
    private void UpDownCamera()
132
    {
133
        float my = Input.GetAxis("Mouse Y");
134
        float updown = my * mousesensitivity;
135
        // computa il nuovo angolo invertendo il valore di Y 
136
        currentCameraUpRot -= updown;
137
138
        // fortunatamente possiamo impostare l'angolo della camera usando un semplice vettore Euleriano
139
        // notate che ruotiamo la camera girandola attorno al suo asse X rosso
140
        fpsCamera.transform.localEulerAngles = new Vector3(currentCameraUpRot, 0, 0);
141
    }
142
}
143