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倍大
—Collider – 碰撞器—
Collider會影響到滑鼠點擊事件、碰撞事件,他的範圍可以不跟物件的圖片一致,在Scene畫面中遊戲物件周圍的綠色框線就是Collider的範圍,一個遊戲物件可以同時擁有多個Collider以組成不規則的形狀,但是2D與3D不能同時存在。
Edge Collider 2D 邊緣碰撞器:
碰撞體為一條線,2D中可作為地面的碰撞使用
Polygon Coliider 2D 多邊形碰撞器 :
加入元件時會依照遊戲物件的Sprite自動形成不規則的碰撞體
IsTrigger觸發器
這個物件的碰撞器就會成為一個觸發器,碰撞的範圍就會變成一個觸發區域,這意思是物件將不再帶有「碰撞」的功能,其他物件與其相撞時會「穿」過去,而不會「碰撞」在一起,可以做為遊戲事件的展開,如傳送點、角色走到觸發區就觸發劇情等等。
Used By Effector 使用效果:
可以添加Effector元件使碰撞器有其他效果,如特定角度碰撞等等,由於這方面較複雜,暫時不多作介紹
—Rigidbody – 剛體—
剛體就是現實中的物體,帶有重力,摩擦力,反彈力。
剛體與碰撞體一樣分為2D(Rigidbody 2D)與3D(Rigidbody )。
兩個帶有剛體的物件互撞時,會互相反彈彈開。
Mass 質量
Linear Drag 線性阻力:物體在移動過程中所受到的阻力
Angular Drag 角阻力:物體在旋轉過程中所受到的阻力
Gravity Scale 重力倍率:物體所受重力的倍率,數值愈大重力愈強
Is Kinematic 運動學:物體將不受到剛體的物理運動影響,也就是關閉剛體的功能
Interpolate 差值:物體的運動與畫面更新率之間的平滑處理
None:不做平滑處裡
Interpolate:物體運動會在畫面更新之前做平滑處理
Extrapolate:物體運動會在畫面更新之後做平滑處理
Sleeping Mode 睡眠模式:
為了節省電腦效能,處理靜態的(未運動)剛體會進入睡眠以減少效能
Never Sleep:永不睡眠
Start Awake:剛體最初是清醒的,進入靜態後才會睡眠
Start Sleep:剛體最初是睡眠的
Collision Detection 碰撞偵測:
Discrete:離散的 我在2D上以連續的物體一直撞他她的Y軸默默地往下掉了,並且我以這個設定在撞擊物上,按下往下移動的話她會穿過地表,不知道原因為何。
Continuose:連續的 我在2D上一直撞他他的Y軸不會變動
Constraints 約束:
Freeze Position 凍結移動:有X軸跟Y軸兩個可以勾選,被勾選的軸將不受到物理影響
Freeze Position 凍結旋轉:只有Z軸可以勾選,勾選後物體將不會旋轉
CollisionEnter 碰撞事件
碰撞時,一方帶有Rigidbody(剛體),就會發生Collision事件。
OnCollisionEnter2D – 碰撞事件
當兩個2D碰撞器碰撞時會發生的事件
OnCollisionExit2D – 分開事件
當兩個2D碰撞器碰撞後,分開時所發生的事件
OnCollisionStay2D – 停滯事件
當兩個2D碰撞器碰撞後,未分開時會持續發生的事件,也可以想做是接觸著碰撞器
OnCollision事件都可以帶有一個參數,這個參數是碰撞到的對象的Collision2D(碰撞資訊)
由於可以獲取碰撞對象訊息,因此可以拿來當作判斷值。
Collision2D Coll
Coll.GameObject.name //印出名字
Trigger
Is Trigger 碰觸到其他碰撞體(或觸發區)時,且一方帶有剛體時,就會觸發Trigger事件
OnTriggerEnter2D – 觸發事件
當一個觸發區與一個碰撞體(或觸發區)觸碰時會發生
OnTriggerExit2D – 分開事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後離開時會發生
OnTriggerStay2D – 停滯事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後,未離開觸發區時會持續發生
跟CollisionEnter一樣,可以帶有參數。
Trigger 跟 CollisionEnter 唯一的區別就是一個不會穿過去,一個會穿過去
OnCollision與OnTrigger在一次碰撞中是不可能同時發生的,因為Trigger不發生碰撞,碰撞體不是Trigger,但是可以A跟B發生OnCollision,同時A跟C發生OnTrigger。
Component 組件
GetComponent<Move>();//獲取物件的Move組件
GetComponent – 獲取組件 Move – 之前寫的C# Script
可用於繼承
如建立一個Script 把一些常用的參數以及設定輸入
建立全域變數 C#ScriptName variableName
之後建立新的Script Component 在 Start() 處 輸入 variableName = GetComponent<C#Script>
之後可引用該C#裡的變數
如該C#裡面有Speed = 5
則可以 type Speed = variableName.Speed
Speed 就等於variableName的Speed了
射出的物體要造成傷害都需要安裝碰撞器
而如果不需要物理碰撞則需要以觸發器的方式觸發傷害,
但是由於子彈是從自己體內射出,因此會觸發到自己,因此可以建立與敵方區別
if (Input.GetKeyDown(KeyCode.Z))
{
Instantiate(Bullet, transform.position, new Quaternion(0, 0, 0, 0));
bullet.GetComponent<shout>().Team = GetComponent<AllVariable>().Team;
}
void OnTriggerEnter2D(Collider2D col) {
if (col.GetComponent<shout>().Team != Team) {
HP -= 10;
Destroy(col.gameObject)
if (HP < 0) {
Destroy(gameObject);
}
}
}
全域變數宣告
float speed;
void Start()
{
speed = GetComponent<AllVariable>().Speed;
}
不能宣告
float speed = GetComponent<AllVariable>().Speed;
因為並非static變數,因此無法在程式一開始時就生成。
void AImove() 移動
{
if (Mathf.Abs(posx - transform.position.x) > 0.1f)
{
if (posx < transform.position.x) //左邊
transform.Translate(Vector2.left * speed * Time.deltaTime);
else //右邊
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
}
float lctime = 0;
float lcneedtime = 3f;
void AItime() 計時
{
if (lctime <= 0) //如果LocateTime <= 0
{
lctime = lcneedtime; //設定LocateTime為LocateNeedTime
posx = Random.Range(-3, 3); //讓posX為亂數-3~3
}
else //否則LocateTime減去Time.deltaTime達成計時效果
{
lctime -= Time.deltaTime;
}
}
float stime = 0.1f;
float sneedtime = 0.1f;
void AIShooting() 自動射擊
{
if (stime <= 0) //ShootingTime <= 0
{
stime = sneedtime; //設定ShootingTime為ShootingNeedTime
GameObject bullet = (GameObject)Instantiate(BulletB,transform.position, new Quaternion(0, 0, 0, 0));
//克隆一個Bullet在小飛兵的位置,轉型成GameObject型態將值給予bullet
bullet.GetComponent<shoutmove>().Team = GetComponent<AllVariable>().Team;
//設定bullet的BulletMove中的Team值 為 此物件的Unit的Team
bullet.transform.Rotate(0, 0, 0);//旋轉180度
}
else //否則ShootingTime減去Time.deltaTime達成計時效果 當比零小時進入上面後變成0.1然後循環
{
stime -= Time.deltaTime;
}
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 – 碰撞器—
碰撞體為一條線,2D中可作為地面的碰撞使用
Polygon Coliider 2D 多邊形碰撞器 :
加入元件時會依照遊戲物件的Sprite自動形成不規則的碰撞體
IsTrigger觸發器
這個物件的碰撞器就會成為一個觸發器,碰撞的範圍就會變成一個觸發區域,這意思是物件將不再帶有「碰撞」的功能,其他物件與其相撞時會「穿」過去,而不會「碰撞」在一起,可以做為遊戲事件的展開,如傳送點、角色走到觸發區就觸發劇情等等。
Used By Effector 使用效果:
可以添加Effector元件使碰撞器有其他效果,如特定角度碰撞等等,由於這方面較複雜,暫時不多作介紹
—Rigidbody – 剛體—
剛體就是現實中的物體,帶有重力,摩擦力,反彈力。
剛體與碰撞體一樣分為2D(Rigidbody 2D)與3D(Rigidbody )。
兩個帶有剛體的物件互撞時,會互相反彈彈開。
Mass 質量
Linear Drag 線性阻力:物體在移動過程中所受到的阻力
Angular Drag 角阻力:物體在旋轉過程中所受到的阻力
Gravity Scale 重力倍率:物體所受重力的倍率,數值愈大重力愈強
Is Kinematic 運動學:物體將不受到剛體的物理運動影響,也就是關閉剛體的功能
Interpolate 差值:物體的運動與畫面更新率之間的平滑處理
None:不做平滑處裡
Interpolate:物體運動會在畫面更新之前做平滑處理
Extrapolate:物體運動會在畫面更新之後做平滑處理
Sleeping Mode 睡眠模式:
為了節省電腦效能,處理靜態的(未運動)剛體會進入睡眠以減少效能
Never Sleep:永不睡眠
Start Awake:剛體最初是清醒的,進入靜態後才會睡眠
Start Sleep:剛體最初是睡眠的
Collision Detection 碰撞偵測:
Discrete:離散的 我在2D上以連續的物體一直撞他她的Y軸默默地往下掉了,並且我以這個設定在撞擊物上,按下往下移動的話她會穿過地表,不知道原因為何。
Continuose:連續的 我在2D上一直撞他他的Y軸不會變動
Constraints 約束:
Freeze Position 凍結移動:有X軸跟Y軸兩個可以勾選,被勾選的軸將不受到物理影響
Freeze Position 凍結旋轉:只有Z軸可以勾選,勾選後物體將不會旋轉
CollisionEnter 碰撞事件
碰撞時,一方帶有Rigidbody(剛體),就會發生Collision事件。
OnCollisionEnter2D – 碰撞事件
當兩個2D碰撞器碰撞時會發生的事件
OnCollisionExit2D – 分開事件
當兩個2D碰撞器碰撞後,分開時所發生的事件
OnCollisionStay2D – 停滯事件
當兩個2D碰撞器碰撞後,未分開時會持續發生的事件,也可以想做是接觸著碰撞器
OnCollision事件都可以帶有一個參數,這個參數是碰撞到的對象的Collision2D(碰撞資訊)
由於可以獲取碰撞對象訊息,因此可以拿來當作判斷值。
Collision2D Coll
Coll.GameObject.name //印出名字
Trigger
Is Trigger 碰觸到其他碰撞體(或觸發區)時,且一方帶有剛體時,就會觸發Trigger事件
OnTriggerEnter2D – 觸發事件
當一個觸發區與一個碰撞體(或觸發區)觸碰時會發生
OnTriggerExit2D – 分開事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後離開時會發生
OnTriggerStay2D – 停滯事件
當一個觸發區與一個碰撞體(或觸發區)觸碰後,未離開觸發區時會持續發生
跟CollisionEnter一樣,可以帶有參數。
Trigger 跟 CollisionEnter 唯一的區別就是一個不會穿過去,一個會穿過去
OnCollision與OnTrigger在一次碰撞中是不可能同時發生的,因為Trigger不發生碰撞,碰撞體不是Trigger,但是可以A跟B發生OnCollision,同時A跟C發生OnTrigger。
Component 組件
GetComponent<Move>();//獲取物件的Move組件
GetComponent – 獲取組件 Move – 之前寫的C# Script
可用於繼承
如建立一個Script 把一些常用的參數以及設定輸入
建立全域變數 C#ScriptName variableName
之後建立新的Script Component 在 Start() 處 輸入 variableName = GetComponent<C#Script>
之後可引用該C#裡的變數
如該C#裡面有Speed = 5
則可以 type Speed = variableName.Speed
Speed 就等於variableName的Speed了
射出的物體要造成傷害都需要安裝碰撞器
而如果不需要物理碰撞則需要以觸發器的方式觸發傷害,
但是由於子彈是從自己體內射出,因此會觸發到自己,因此可以建立與敵方區別
if (Input.GetKeyDown(KeyCode.Z))
{
Instantiate(Bullet, transform.position, new Quaternion(0, 0, 0, 0));
bullet.GetComponent<shout>().Team = GetComponent<AllVariable>().Team;
}
void OnTriggerEnter2D(Collider2D col) {
if (col.GetComponent<shout>().Team != Team) {
HP -= 10;
Destroy(col.gameObject)
if (HP < 0) {
Destroy(gameObject);
}
}
}
全域變數宣告
float speed;
void Start()
{
speed = GetComponent<AllVariable>().Speed;
}
不能宣告
float speed = GetComponent<AllVariable>().Speed;
因為並非static變數,因此無法在程式一開始時就生成。
void AImove() 移動
{
if (Mathf.Abs(posx - transform.position.x) > 0.1f)
{
if (posx < transform.position.x) //左邊
transform.Translate(Vector2.left * speed * Time.deltaTime);
else //右邊
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
}
float lctime = 0;
float lcneedtime = 3f;
void AItime() 計時
{
if (lctime <= 0) //如果LocateTime <= 0
{
lctime = lcneedtime; //設定LocateTime為LocateNeedTime
posx = Random.Range(-3, 3); //讓posX為亂數-3~3
}
else //否則LocateTime減去Time.deltaTime達成計時效果
{
lctime -= Time.deltaTime;
}
}
float stime = 0.1f;
float sneedtime = 0.1f;
void AIShooting() 自動射擊
{
if (stime <= 0) //ShootingTime <= 0
{
stime = sneedtime; //設定ShootingTime為ShootingNeedTime
GameObject bullet = (GameObject)Instantiate(BulletB,transform.position, new Quaternion(0, 0, 0, 0));
//克隆一個Bullet在小飛兵的位置,轉型成GameObject型態將值給予bullet
bullet.GetComponent<shoutmove>().Team = GetComponent<AllVariable>().Team;
//設定bullet的BulletMove中的Team值 為 此物件的Unit的Team
bullet.transform.Rotate(0, 0, 0);//旋轉180度
}
else //否則ShootingTime減去Time.deltaTime達成計時效果 當比零小時進入上面後變成0.1然後循環
{
stime -= Time.deltaTime;
}
留言
張貼留言