1. 程式人生 > >Unity3D學習筆記(三):V3、運動、幀率、OnGUI

Unity3D學習筆記(三):V3、運動、幀率、OnGUI

靈活 void 有一個 pow 結構 間隔 NPU generic 最大值

盯著看:盯住一個點 transform.LookAt(Vector3 worldPosition);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LookGirl : MonoBehaviour {
    GameObject girl;
       // Use this for initialization
       void Start () {
        girl = GameObject.Find("Girl");
    }
       
       
// Update is called once per frame void Update () { //盯著看:盯住一個點 transform.LookAt(girl.transform.position); //環繞旋轉:point點,axis軸,angle每幀旋轉角度 transform.RotateAround(girl.transform.position,Vector3.up,1); } }
環繞旋轉:point點,axis軸,angle每幀旋轉角度 transform.RotateAround(Vector3 point, Vector3 axis, float angle); 顯示在檢視面板的任何屬性,可以直接修改。即使腳本變量也可以改變,而無需修改腳本本身。你可以在檢視面板運行時修改變量,進行試驗調試你的遊戲。在腳本中,如果你定義了一個公共變量的對象類型(如遊戲物體或變換),你可以拖動一個遊戲物體或預制到檢視面板對應的槽。 公轉
using
System.Collections; using System.Collections.Generic; using UnityEngine; //可以在檢視面板暴露枚舉 public enum Sex { Man, Woman } public class TurnPublic : MonoBehaviour { //在檢視面板暴露一個對象變量,讓遊戲物體可以拖拽賦值 public GameObject target; //在檢視面板暴露Transform組件 public Transform trans; //檢視面板可以暴露以下 public int level;
public float health; public string path; public bool canMove; public Sex sex; public int[] array; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.RotateAround(target.transform.position, target.transform.up, 1); } }

自轉

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TurnSelf : MonoBehaviour {
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
        transform.Rotate(transform.up);
    }
}

監聽鼠標和鍵盤的按下事件 bool:Input.GetKey(KeyCode KeyCode) bool:Input.GetMouseButtonDown(int index) 軸值 Size:添加元素 Horizontal:水平軸 Vertical:垂直軸 Mouse X:鼠標水平位移的軸值映射 Mouse Y:鼠標垂直位移的軸值映射 Mouse ScrollWheel:鼠標滾輪的軸值映射 Time時間類, Time.deltaTime:代表每一幀所消耗的時間,平移的過程中讓速度和此量相乘,就從每幀多少米變成每秒多少米。(兩幀之間的間隔) Time.time:代表著從遊戲一開始運行到當前時間點所經過的總時長,是從Time.deltaTime累加上來的。 Time.fixedDeltaTime:每一物理幀所消耗的時間。 Time.timeScale:時間縮放,可以影響Time.deltaTime,FixedUpdate,fixedTime。如果寫在Update裏的代碼想要和時間縮放掛鉤,就和Time.timeScale發生關系。(可以用作遊戲暫停) Time.fixedTime:累加Time.deltaTime並乘以時間縮放,時間縮放為0,則值為0。 Mathf是數學的結構體,其方法均為靜態
Deg2Rad:角度轉弧度(2是to的意思)* PI / 180
Rad2Deg:弧度轉角度
Abs:絕對值
sin:正弦,Sin(1/2)=30度
cos:余弦
tan:正切
Asin:反正弦,Sin(1/2)=60度
Acos:反余弦
Atan:反正切
Ceil:向上取整數
Floor:向下取整數
Clamp:限值,Clamp(05),輸入5.1,返回5,(可以把坐標限值在一定範圍內,防止越界)
Clamp01:
Lerp:線性插值
log:取對數
Movetowards:是插值的一種
Pow(float f , float p):f的p次方
Sqrt:開平方
PI:3.1415926
Max:最大值
Min:最小值
三角函數曲線
三角函數分鏡
16:9等比縮放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputTest : MonoBehaviour
{
    //拖拽資源文件夾裏的
    public Texture image;
    int sum;
    int curNum;
    float h;
    float v;
    float mouse_h;
    float mouse_v;
    public float m_JumpSpeed = 400f;
    private bool m_jumping = false;
    private Rigidbody m_Rigidbody;
    private Animator m_Anim;
    private void Awake()
    {
        m_Anim = GetComponent<Animator>();
        m_Rigidbody = GetComponent<Rigidbody>();
    }
    private bool jumped = true;
    // Use this for initialization
    void Start()
    {
 
    }
    // Update is called once per frame
    void Update()
    {
        //實時監聽
        //GetKey按住,GetKey.Down按下,GetKey.Up擡起,KeyCode鍵盤按鍵的枚舉項
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward);
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.back);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(Vector3.down);
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(Vector3.up);
        }    
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("FUCK");
        }
        //軸值映射
        //GetAxis獲取軸值,顯示軸值的變化(-1~1)
        //水平:Horizontal
        //垂直:Vertical
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        //按幀移動,和電腦性能有關,幀速快的電腦,移動速快
        transform.Translate(Vector3.forward * 0.1f * v);
        transform.Rotate(Vector3.down * 1.0f * h);
        if (transform.position.z <-50 || transform.position.z > 50)
        {
            transform.position += new Vector3(0, 0, Mathf.Clamp(transform.position.z, -40, 40));
        }
        else
        {
            transform.Translate(Vector3.forward * 0.1f * v);
        }
        //鼠標有靈活度,根據快慢分等級,顯示軸值的變化不是固定的
        mouse_h = Input.GetAxis("Mouse X");
        mouse_v = Input.GetAxis("Mouse Y");
        //按秒移動,和電腦性能無關,把每幀多少米變成每秒多少米
        //Time.deltaTime每幀刷新所需要的時間
        //Time.time是Time.deltaTime的累加(從遊戲開始到現在,大致經過的時間),
        //Time.fixedDeltaTime是每一物理幀的時間間隔,固定值0.02s
        transform.Translate(Vector3.forward * 0.1f * v);
        transform.Rotate(Vector3.down * 1.0f * h);
        //每秒走的路程 = 每幀走1米(速度) * 每幀消耗的時間1/60秒(時間)
        transform.Translate(Vector3.forward * Time.deltaTime);
        //用Mathf.Clamp函數限值坐標的取值範圍
        Clamp(float value, float min, float max);
        Mathf.Clamp(transform.position.x, -40, 40);
        Mathf.Clamp(transform.position.z, -40, 40);
        #region 限值物體移動範圍
        #endregion
    }
}

//OnGUI商業已不用,現主要用於調試
void OnGUI()
{
    //兩種方式:自定義布局方式,自動排版方式
    //自動排版方式
    if (curNum <= 1000)
    {
        sum += curNum;
        curNum++;
    }
    GUILayout.Label("當前和:" + sum);
    GUILayout.Button("FUCK");
    GUILayout.Box(image);
    GUILayout.Label("Horizontal:" + h);
    GUILayout.Label("Vertical:" + v);
    //GUILayout.Label("Mouse X:" + mouse_h);
    //GUILayout.Label("Mouse Y:" + mouse_v);
    GUILayout.Label("Time.deltaTime:" + Time.deltaTime);
    GUILayout.Label("Time.time:" + Time.time);
    GUILayout.Label("Time.fixedDeltaTime:" + Time.fixedDeltaTime);
    if (GUILayout.Button("FUCK"))
    {
        //timeScale是時間縮放,時間變慢了1倍(變成原來的0.5倍),只能縮放Time.deltaTime
        Time.timeScale = 0.5f;
    }
}

復習

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// MonoBehaviour ->  Behaviour -> Component -> Object
public class W05d4 : MonoBehaviour
{
    public GameObject obj;   // Cube
    // Use this for initialization
    void Start()
    {
        // 如何獲取組件
        // Component -> GetComponent
        Camera cam = GetComponent<Camera>();
        if (cam != null)
        {
            cam.depth = 0;
        }
        // 如何添加組件
        GameObject->AddComponent
        // 先尋找Cube
        Move cubeMove = obj.AddComponent<Move>();    // 返回值:添加的那個組件的對象引用
        cubeMove.moveSpeed = 0.1f;
        // 刪除組件
        // UnityEngine.Object -> Destroy
        GameObject findObj = GameObject.Find("Player");
        if (findObj != null)
        {
            // 把移動速度變成0.5
            // 1 獲取Move組件
            Move cubeMove = findObj.GetComponent<Move>();
            if (cubeMove != null)
            {
                // 2 改Move組件的變量
                cubeMove.moveSpeed = 0.5f;
            }
        }
        GameObject findObj = GameObject.Find("Player/Capsule/FirePos");
        if (findObj)    // findObj != null
        {
            Light light = findObj.AddComponent<Light>();
            light.type = LightType.Spot;
        }
    }
    // Update is called once per frame
    void Update()
    {
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
    public Texture texture;
    float h;
    float v;
    float hRaw;
    float vRaw;
    float mouseH;
    float mouseV;
    float mouseScrollWheel;
    public float moveSpeed = 0.1f;
    public float rotSpeed = 1f;
    // Use this for initialization
    void Start()
    {
    }
    void Update()
    {
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxisRaw("Vertical"));
        transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime * Input.GetAxisRaw("Horizontal"));
    }
    // Update is called once per frame
    void Update1()
    {
        // 按鍵輸入
        // 1、鍵盤的 鍵值
        if (Input.GetKey(KeyCode.A))   // 按著A的時候 每幀都會檢測到
        {
        }
        if (Input.GetKeyDown(KeyCode.A))   // 按下A的那一幀 會檢測到
        {
        }
        if (Input.GetKeyUp(KeyCode.A))     // 擡起A的那一幀 會檢測到
        {
        }
        // 2、       軸值
        // 按A、D 或者 方向鍵左、方向鍵右的時候會返回一個float值, 如果不按會返回0
        // 會有一個漸變的過程 假設我按了A 這時返回值會從 0 逐漸變化到 -1
        //                            D               0            1
        // 受時間縮放影響的
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        //不受時間縮放的影響
        mouseH = Input.GetAxis("Mouse X");
        mouseV = Input.GetAxis("Mouse Y");
        mouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
        //沒有漸變的過程 按下A hRaw 變成了-1 按下D hRaw 變成了 1
        hRaw = Input.GetAxisRaw("Horizontal");
        vRaw = Input.GetAxisRaw("Vertical");
        // 3、       功能鍵
        if (Input.GetButtonDown("Jump"))
        {
            Debug.Log("功能鍵 Jump 被按下");
        }
        // 鼠標輸入
        // 0 左鍵 1 右鍵 2 中鍵
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠標左鍵 被按下");
        }
    }
    private void OnGUI()
    {
        GUI.Label(new Rect(100, 100, 200, 150), "Hello World");
        if (GUI.Button(new Rect(100, 300, 200, 150), "Button"))
        {
            GameObject target = GameObject.Find("Target1");
            if(target)
            {
                transform.LookAt(target.transform);
            }
            GameObject target2 = GameObject.Find("Target2");
            if(target2)
            {
                target2.transform.LookAt(transform);
            }
        }
        if(GUI.Button(new Rect(10, 10, 80, 80), texture))
        {
        }
        GUI.Label(new Rect(0, 0, 80, 50), "Width :" + Screen.width);
        GUI.Label(new Rect(0, 60, 80, 50), "Height :" + Screen.height);
        //GUI.DrawTexture(new Rect(10, 10, 80, 80), texture);
        //GUILayout.Label("H : " + h);
        //GUILayout.Label("mouseH : " + mouseH);
        //GUILayout.Label("mouseV : " + mouseV);
        //GUILayout.Label("mouseScrollWheel : " + mouseScrollWheel);
        //GUILayout.Label("hRaw : " + hRaw);
        //GUILayout.Label("vRaw : " + vRaw);
        //if (GUILayout.Button("TimeScale" + Time.timeScale))
        //{
        //    Time.timeScale = 1 - Time.timeScale;
        //}
    }
}

練習題

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Question : MonoBehaviour
{
    public GameObject objA;
    public GameObject objB;
    public const float TimeInterval = 0.5f;   // 冷卻時間
    public float timeCount = 0;
    public float currentTime = 0;           // 記錄當前的Time.time
    #region Q1_如何註視
    // 1、遊戲物體A 註視 遊戲物體B
    // 2、當前腳本掛載的遊戲物體 註視 遊戲物體A
    #endregion
    #region Q2_如何圍繞旋轉
    // 1、遊戲物體A 圍繞 遊戲物體B 繞世界坐標系的 Y軸 旋轉  --每秒旋轉60度
    // 2、遊戲物體A 圍繞 遊戲物體B 的 Y軸 旋轉
    #endregion
    #region Q3_響應鍵盤按鍵事件
    // 操控 當前掛載腳本的 遊戲物體
    // 1、按下 數字鍵0 發射子彈(偽代碼替代)
    // 2、按下 空格鍵 跳躍(偽代碼替代)
    // 3、按下 W、S鍵 前後移動
    // 4、使用軸值的方式控制物體 繞世界的Y軸 旋轉
    // 5、使用軸值的方式控制物體 繞自身的Y軸 旋轉
    // 6、使用鼠標的XY軸值控制物體的 俯仰角(繞X軸旋轉的角度)、偏航角(繞Y軸旋轉的角度) //註: 俯仰角、偏航角、滾轉角 --歐拉角/姿態角
    // 7、按下鼠標左鍵 發射子彈(偽代碼替代)
    // 8、通過鼠標滾輪 實現物體 前後移動(自身坐標系)
    #endregion
    #region Q4_Time類 OnGUI
    // 1、按下鼠標右鍵可以發射子彈,子彈的發射間隔為 0.5秒
    // 2、使用自動布局的方式繪制按鈕,按鈕被按下以後,可以暫停遊戲
    #endregion
    #region Q5_Mathf類
    // 1、求絕對值
    // 2、開方
    // 3、如何限制一個變量的取值範圍
    // 4、向上、向下取整
    // 5、正弦、余弦函數
    #endregion
    void Start()
    {
        currentTime = Time.time;
    }
    void Update()
    {
        #region Q1_如何註視_Answer
        // 1、遊戲物體A 註視 遊戲物體B
        objA.transform.LookAt(objB.transform);
        // 2、當前腳本掛載的遊戲物體 註視 遊戲物體A
        transform.LookAt(objA.transform);
        #endregion
        #region Q2_如何圍繞旋轉_Answer
        // 1、遊戲物體A 圍繞 遊戲物體B 繞世界坐標系的 Y軸 旋轉  每秒旋轉60度
        objA.transform.RotateAround(objB.transform.position, Vector3.up, 60 * Time.deltaTime);
        // 2、遊戲物體A 圍繞 遊戲物體B 的 Y軸 旋轉
        // objB.transform.up  物體自身的Y軸 在世界坐標系中的 向量
        objA.transform.RotateAround(objB.transform.position, objB.transform.up, 60 * Time.deltaTime);
        #endregion
        #region Q3_響應鍵盤按鍵事件_Answer
        // 1、按下 數字鍵0 發射子彈(偽代碼替代)
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
            // 發射子彈
        }
        // 2、按下 空格鍵 跳躍(偽代碼替代)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 跳躍
        }
        // 3、按下 W、S鍵 前後移動
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);       // 往自身的前方
            transform.Translate(transform.forward * 1 * Time.deltaTime, Space.World);    // 往自身的前方
            transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);      // 往世界的前方
        }
        else if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.back * 1 * Time.deltaTime);
        }
        // 4、使用軸值的方式控制物體 繞世界的Y軸 旋轉
        float h = Input.GetAxis("Horizontal");
        transform.Rotate(Vector3.up * 1 * Time.deltaTime * h, Space.World);    // 世界
        // 5、使用軸值的方式控制物體 繞自身的Y軸 旋轉
        transform.Rotate(Vector3.up * 1 * Time.deltaTime * h, Space.Self);    // 自身  第2個參數不指定,默認 Space.Self
        // 6、使用鼠標的XY軸值控制物體的 俯仰角(繞X軸旋轉的角度)、偏航角(繞Y軸旋轉的角度) //註: 俯仰角、偏航角、滾轉角 --歐拉角/姿態角
        float mouseX = Input.GetAxis("Mouse X");   // 偏航角
        float mouseY = Input.GetAxis("Mouse Y");
        Vector3 eu = transform.eulerAngles;
        eu.y += mouseX;
        eu.x += mouseY;
        transform.eulerAngles = eu;
        // 7、按下鼠標左鍵 發射子彈(偽代碼替代)
        if (Input.GetMouseButtonDown(0))
        {
            // 發射子彈
        }
        // 8、通過鼠標滾輪 實現物體 前後移動(自身坐標系)
        float msw = Input.GetAxis("Mouse ScrollWheel");
        transform.Translate(Vector3.forward * 1 * Time.deltaTime * msw);
        #endregion
        #region Q4_Time類 OnGUI_Answer
        // 1、按下鼠標右鍵可以發射子彈(偽代碼),子彈的發射間隔為 0.5秒
        timeCount += Time.deltaTime;
        if (timeCount >= TimeInterval)
        {
            if (Input.GetMouseButtonDown(1))
            {
                // 發射子彈
                // 重置時間
                timeCount = 0;
            }
        }
        if (Time.time - currentTime >= TimeInterval)
        {
            // 發射子彈
            if (Input.GetMouseButtonDown(1))
            {
                // 發射子彈
                // 重置時間
                currentTime = Time.time;
            }
        }
        // 2、使用自動布局的方式繪制按鈕,按鈕被按下以後,可以暫停遊戲
        #endregion
        #region Q5_Mathf類_Answer
        // 1、求絕對值
        float num1 = -10.2f;
        //num1 = Mathf.Abs(num1);
        // 2、開方
        //num1 = Mathf.Sqrt(num1);
        // 3、如何限制一個變量的取值範圍
        num1 = Mathf.Clamp(num1, 0, 100);
        // 4、向上、向下取整
        num1 = Mathf.Ceil(num1);     // 向上取整  -10
        num1 = Mathf.Floor(num1);    // 向下取整  -11
        // 5、正弦、余弦函數
        num1 = Mathf.Sin(num1);
        num1 = Mathf.Cos(num1);
        #endregion
    }
    private void OnGUI()
    {
        // 2、使用自動布局的方式繪制按鈕,按鈕被按下以後,可以暫停遊戲
        if (GUILayout.Button("暫停遊戲"))
        {
            Time.timeScale = 0;
        }
    }
}

Unity3D學習筆記(三):V3、運動、幀率、OnGUI