發表文章

目前顯示的是有「Unity」標籤的文章

Unity Message

 SendMessage(string methodName , object value = null , SendMessageOptions options){} //只能送給自己訊息 BroadcastMessage(string methodName , object parameter = null , SendMessageOptions options) {}//送給自己跟子程式 SendMessageUpward(string methodName ,  object value = null , SendMessageOptions options) {} //送給自己與上層

Unity Physics.Raycast(射線)

 Raycast(Vector3 origin(原始位置), Vector3 direction(目標位置), float maxDistance = Mathf.Infinity(投射距離 預設無限大),  int layerMask = DefaultRaycastLayers(可選擇要投射的layer 預設DefaultRaycastLayers), QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal(選擇是否要忽視觸發器) ); 等於   Raycast(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal); Ray 包含V3 orgign 和 V3 direction ------------------------------------------------------ int distnce = 10; //距離 Renderer hitRenderer; Vector3 forward = transform.TransformDirection(Vector3.forward); //建立射線 Ray ray = new Ray(transform.position , forward) //紅色線 Debug.DrawRay(ray.origin , ray.direction * distnce , Color.Red); //取得碰撞 RaycastHit hiter; int layerMask = LayerMask.getMask("other"); //指定layer if (Physics.Raycast(ray , out hit , distnce , layerMask)){     hitRenderer = hit.collider.GetComponent<Renderer...

Unity 碰撞器(Collision) 觸發器(trigger)

OnCollisionEnter(Collision collision){} //碰撞器進入 OnCollisionExit(Collision collision){} //碰撞器離開 OnTriggerEnter(Collider trigger){} //觸發器進入 OnTriggerExit(Collider trigger){} //觸發器離開

Unity Lerp

由....線性插值轉換到目標值 可以用於顏色等各種事情 Vector3.Lerp(Vector3 a , Vector3 b , float f) Quaternion.Lerp(Quaternion a , Quaternion b , float f) Color.Lerp(Color a , Color b , float f) Mathf.Lerp(Mathf a , Mathf b , float f) 效果為開始值+目標值 / F = 下一次開始值 

Unity Transform&Quaternion

屬性 position 取得物體Vector的位置 rotation 使用Quaternion設定旋轉位置 Questernion =四元數 eulerAngles 取得Vector設定旋轉位置 方法 Translate(Vector3 site )  以Vector3方向移動 TransformDirection(Vector3 dirction) 將Local space 轉換成 world space 並且移動 Rotate(Vector3 rotate)旋轉 依照Vector方向旋轉 LookAt(Transform target)依照某物體旋轉 //沒有把 local space 轉換到 world space. transform.position += move * Time.deltaTime; //有把 local space 轉換到 world space. 會依照目前面向轉向移動 transform.position += transform.TransformDirection(move) * Time.deltaTime; rotation 也可以設計成使用Vector轉向 transform.rotation = Quaternion.Euler(Vector3 vector); ---------------------------------------Quaternion------------------------------ 靜態方法 LookRotation(Vector3 direction); //算出轉向這個角度所需的四元數Quaternion //開始平穩的每秒20單位的往lookatQuaternion方向轉 LookAt沒辦法做到 transform.rotation = Quaternion.RotateTowards(transform.rotation , lookatQuaternion ,  20 * Time.deltaTime);

Unity Time

 Time 靜態屬性 time 遊戲進行了多少時間 進行第一個frame就進行計算 realtimeSinceStartup 遊戲進行了多少時間(不受timeScals)影響 遊戲一開始就進行計算 deltaTime 每個frame進行了多久時間 單位為秒 TimeScals 加速及減速使用 deltaTime 是看FPS進行速度給予 在Edit-ProjectSetting-Other中可以設定VSync Count 為 no count 然後再自己設定更新頻率 Application.targetFrameRate = 30; FixedUpdate 是每秒固定的數值 不像Update還是會飄

Unity Vector

public Vector3(float x , float y , float z); 靜態屬性 Vector.XXX forward(0 , 0 , 1) 向前 back(0 , 0 , -1)向後 up(0 , 1 , 0)向上 down(0 , -1 , 0)向下 right(1 , 0 , 0)右 left(-1 , 0 , 0)左 屬性 magnitude 取得長度 sqrMagnitude. 取得長度不開平方根,單純用於比較用 normalize 將向量規格化,只留下方向 靜態方法 Cross 得到向量 兩物體之間的外積,常用於計算是在物體左邊右邊 Dot 得到浮點數 兩物體之間向量乘,常用於計算A物體在B物體前面還是後面 //本地座標轉換世界座標 Vector forward = transform.TransformDirection(vector3.forward); //計算兩個向量方向 Vector toOther = target.position - transform.position; float dot = vector3.Dot(forward , toOther); //dot = 0平行 > 0 前方 < 0 後方 Vector cross = Vector.Cross(forward , toOther); //cross.y (用Y軸判斷) = 0 重疊 > 0右方 < 0 左方 ------------------------------------------- public float Speed; public Vector3 targetPoint; //目標移動 可以調整 Vector currentPoint = transform.position; float SpeedDelta = Time.deltaTime * Speed; //Speed 從外部輸入 //最後不會超過TargetPoint transform.position = Vector.MoveTowards(currentPoint , targetPoint , SpeedDelta);

Unity課程

Layer 系列 Layer 主要是大範圍分組 如 樹 人 之類的 Tag 算是小範圍分組 如這個敵人 是龍 是人 是蟲 Prefab 系列 用於快速複製相同物 使用apply all 可以一次改變所有同Prefab  C#部分 [hideInInSpector] 可以隱藏參數(設定public的話會在物件中出現) out & ref out 可以不先設定初始值 out的意思是 最後會變成 也就是 void function(){ int a; setA(out a); //回到這邊時 a = 20 } int setA(out int a){ a = 20; } 封裝進階 int _ATK = 10; public int ATK{     get{     return _ATK;      }     set{     _ATK = value;      } } 呼叫 Weaponclass Weapon = new Weaponclass() Weapon.ATK = 30; // ATK=30 Weapon.ATK //get Weapon.ATK public struct TestStruct{     public int int_1;     public  TestStruct(int test){     int_1 = test;      } } 呼叫後 由於飾struct 因此不會更改值 public class use{           void use{      TestStruct TS = new TS(10);     TS.int_1 = 90; //結果TS還是等於10 因為只有傳值      }      } 靜態類別通常用於場景轉換,用於存取上一狀態     Uni...

Unity3D GUI設計

GUI的代碼要寫在 OnGUI()內 不然不會運作 一個GUI大致上是長這樣 GUI.Type(new Rect(X ,Y ,width , length) , string 內文) 以下是GUI種類 https://docs.unity3d.com/ScriptReference/GUI.html

Unity3D 按下事件 OnMouse, GetKey, Input

 OnMouse Click 滑鼠點擊事件 OnMouseDown – 滑鼠點擊事件:在滑鼠點擊物件時會觸發 OnMouseDrag – 滑鼠拖曳事件:在滑鼠點擊後「按住」滑鼠時會觸發 OnMouseUp – 滑鼠放開事件:在滑鼠點擊後,放開滑鼠時會觸發 OnMouseEnter – 滑鼠進入事件:在滑鼠進入物件的碰撞區時觸發 OnMouseExit – 滑鼠離開事件:在滑鼠離開物件的碰撞區時觸發 OnMouseOver – 滑鼠停滯事件:在滑鼠停留在物件的碰撞區時觸發 Input.mousePosition - 取得滑鼠目前位置 GetKey 按鍵事件 GetKey – 按住按鍵:按著按鍵時會傳回True GetKeyDown – 按下按鍵:按下按鍵時會傳回True GetKeyUp – 放開按鍵:放開按鍵時會傳回True 一般會把按鍵事件寫在Update()底下 方向鍵上下左右 if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(Vector2.left * Time.deltaTime); if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(Vector2.right * Time.deltaTime); if (Input.GetKey(KeyCode.UpArrow)) transform.Translate(Vector2.up * Time.deltaTime); if (Input.GetKey(KeyCode.DownArrow)) transform.Translate(Vector2.down * Time.deltaTime); 按住W可以前進 同理可以用於其他按鍵 if (Input.GetKey(KeyCode.W)) transform.Translate(Vector2.up * Time.deltaTime); Input.GetKey(KeyCode.(input))監聽按鍵用

Unity重新撰寫格式

格式為 文章標題 : Unity + 用處 + funtion name 內文 : funtion.use 用處 + 程式碼

unity 燈光,手電筒等 light

在物件中再設定一個Light Component() 就可以有燈光。 range = 控制範圍 color = Color(lightColorR,lightColorG,lightColorB); using System.Collections; using System.Collections.Generic; using UnityEngine; public class LightControll : MonoBehaviour {     public float duration = 1;     public Light lt;     // Start is called before the first frame update     void Start()     {         lt = GetComponent<Light>();     }     // Update is called once per frame     void Update()     {         float phi = Time.time / duration * 2 * Mathf.PI; //時間無限增加         float amplitude = Mathf.Cos(phi) * 0.5f; //用三角函數讓她一下正一下負 1 0 -1 0 , *0.5 是讓他燈光變暗(亮度減少)         lt.intensity = amplitude;         print(Mathf.Cos(phi));         //lt.intensity = 0.5f;     } }

Unity 攝影機跟隨 Lerp

Lerp(position A, position B, 切割等份); 會維持A-B的切割等份進行位置分配 理解Lerp 就很好理解這段了 Lerp公式為 a + (b-a) *t 回傳值是Vector3 因此 forward 是改變Z軸 0 0 1的部分 dist給越高 距離目標物的Z軸差距越大 up則是改變Y軸 0 1 0的部分 height越大 離目標的Y軸越遠 最後的float 我測了一下給什麼好像都沒太大的差別 給越大移動越平滑 但是照理來說他應該離target越來越近 我也不知道為何不會越來越近 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Camera : MonoBehaviour {     public Transform targetTr;     public float dist = 10f;     public float height = 3.0f;     public float dampTrace = 20.0f;     public Transform tr;     // Start is called before the first frame update     void Start()     {         tr = GetComponent<Transform>();         /*         print(targetTr.forward * dist); //0 0 1         print(Vector3.up * height); //0 1 0         print(Time.deltaTime); //0.02...

Unity 3D

gameObject.transform.position = new Vector(0,0,0); //設定一開始位置 if (Input.GetKey(KeyCode.W)) gameObject.transform.position += new Vector3(0, 0, 1) * Time.deltaTime * Speed; //疊加位置 可以移動 LeftShift Space RightShift //KeyCode部分 float = Vector3.Distance(Vector , Vector) //判斷兩者差距多遠 回傳一個float (絕對值) position = Vector3.Lerp(Vector a, Vector b, float) //取 a + (b-a)*float的值 forward = Vector3(0 , 0 , 1); Transform.LookAt(target); //看向目標 主要是藉由控制rotation來達到目標 Invoke("class.name" , time); //延遲幾秒進行 Invoke("class.name" , time , deltatime) //延遲幾秒進行並且deltatime循環 playmaker

Unity 常用語法(未完成)

position 位置 Vector2 or Vector3 pos = transform.position; //獲得遊戲物件的位置 rotate = transform.rotation.eulerAngles; //獲得遊戲物件當前的旋轉值 scale = transform.localScale; //獲得遊戲物件的縮放值 transform.position = new Vector3(0, 0, 0); //指定物件位置為座標點(0,0,0) 亦為中心點 transform.Rotate(new Vector3(0, 0, 1)); //Z軸旋轉1度 transform.localScale = new Vector2(1.5f, 1.5f); //更改為1.5倍大 在屬性視窗中點擊Add Component(增加組件)後,輸入Box C就會跳出Box Collider與Box Collider 2D,由於我們是2D遊戲,因此選擇Box Collider 2D。 —Collider – 碰撞器— Collider會影響到滑鼠點擊事件、碰撞事件,他的範圍可以不跟物件的圖片一致,在Scene畫面中遊戲物件周圍的綠色框線就是Collider的範圍,一個遊戲物件可以同時擁有多個Collider以組成不規則的形狀,但是2D與3D不能同時存在。 Edge Collider 2D 邊緣碰撞器: 碰撞體為一條線,2D中可作為地面的碰撞使用 Polygon Coliider 2D 多邊形碰撞器 : 加入元件時會依照遊戲物件的Sprite自動形成不規則的碰撞體 IsTrigger觸發器 這個物件的碰撞器就會成為一個觸發器,碰撞的範圍就會變成一個觸發區域,這意思是物件將不再帶有「碰撞」的功能,其他物件與其相撞時會「穿」過去,而不會「碰撞」在一起,可以做為遊戲事件的展開,如傳送點、角色走到觸發區就觸發劇情等等。 Used By Effector 使用效果: 可以添加Effector元件使碰撞器有其他效果,如特定角度碰撞等等,由於這方面較複雜,暫時不多作介紹 —Rigidbody – 剛體— 剛體就是現實中的物體,帶有重力,摩擦力,反彈力。 剛體與碰撞體一樣分為2D(Rigidbody 2D)與3...