Unity3D學習筆記(三):V3、運動、幀率、OnGUI
阿新 • • 發佈:2019-02-11
靈活 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"); }環繞旋轉:point點,axis軸,angle每幀旋轉角度 transform.RotateAround(Vector3 point, Vector3 axis, float angle); 顯示在檢視面板的任何屬性,可以直接修改。即使腳本變量也可以改變,而無需修改腳本本身。你可以在檢視面板運行時修改變量,進行試驗調試你的遊戲。在腳本中,如果你定義了一個公共變量的對象類型(如遊戲物體或變換),你可以拖動一個遊戲物體或預制到檢視面板對應的槽。 公轉// Update is called once per frame void Update () { //盯著看:盯住一個點 transform.LookAt(girl.transform.position); //環繞旋轉:point點,axis軸,angle每幀旋轉角度 transform.RotateAround(girl.transform.position,Vector3.up,1); } }
usingSystem.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(0,5),輸入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