Unity 教學
/// 如果我希望攻擊 (Attack)之後要過五秒以上才可以再次攻擊,
/// 那可以這樣寫:
/// *我先寫 JavaScript:
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
function attackIt( ) {
// 殺他 :-) 就是把殺敵人的動作寫這
//...
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
if (Input.GetKeyDown(KeyCode.Y) && cooled) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
}
**如果要寫 C#, 注意事項如下:
(a) 必須用 class 包起來, 變數宣告寫法略有不同
(b) 那句 StartCoroutine( ) 不可省略為 ggyy( )
(c) function ggyy( ) 函數的 type 必須是 IEnumerator
(d) yield 那句要改為 yield return new WaitForSeconds(5);
(e) 其他(Update, attackIt)的 function 要改用 void
如有不懂歡迎發問 !
/// 那可以這樣寫:
/// *我先寫 JavaScript:
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
function attackIt( ) {
// 殺他 :-) 就是把殺敵人的動作寫這
//...
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
if (Input.GetKeyDown(KeyCode.Y) && cooled) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
}
**如果要寫 C#, 注意事項如下:
(a) 必須用 class 包起來, 變數宣告寫法略有不同
(b) 那句 StartCoroutine( ) 不可省略為 ggyy( )
(c) function ggyy( ) 函數的 type 必須是 IEnumerator
(d) yield 那句要改為 yield return new WaitForSeconds(5);
(e) 其他(Update, attackIt)的 function 要改用 void
如有不懂歡迎發問 !
/// 如果我希望攻擊 (Attack)之後要過五秒以上才可以再次攻擊,
/// 那可以這樣寫:
/// *我先寫 JavaScript:
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
function attackIt( ) {
// 殺他 :-) 就是把殺敵人的動作寫這
//...
Debug.LogWarning(" 啊 !");
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
if (Input.GetKeyDown(KeyCode.Y) ) {
if( cooled) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
else {
Debug.LogError("ㄟ 不可以啦 !");
}
}
}
/// 那可以這樣寫:
/// *我先寫 JavaScript:
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
function attackIt( ) {
// 殺他 :-) 就是把殺敵人的動作寫這
//...
Debug.LogWarning(" 啊 !");
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
if (Input.GetKeyDown(KeyCode.Y) ) {
if( cooled) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
else {
Debug.LogError("ㄟ 不可以啦 !");
}
}
}
Unity 教學 again
//過五秒以上才可以再次攻擊的第二版..
//為了方便測試看出按 y 鍵(加或按下滑鼠左鍵)真的攻擊行動有效,
//稍微改一下: (可直接掛給一個 Cube 做測試)
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
private var haha: int = 0; // 用來表示殺敵狀態
function attackIt( ) {
// 殺他 :-) 通常是設定 殺敵動畫播放 為 true, 現在改用簡單狀態
haha = 1; // 殺出
yield WaitForSeconds(0.88f); // 讓砍殺出動作持續 0.88秒
haha = 2; // 返回
yield WaitForSeconds(1.76f); // 用 1.76秒抽回劍 :-)
haha = 0; // 攻擊完畢; 總共 0.88 + 1.76秒 < 5 秒所以 OK
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
checkHaha( ); // 看看是否要做模擬攻擊的事情
if (cooled) if(Input.GetKeyDown(KeyCode.Y) || Input.GetMouseButtonDown(0) ) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
} // Update(
function checkHaha( ) {
if(haha == 1){
transform.RotateAround(Vector3.zero, Vector3.up, 123 * Time.deltaTime); // 每秒123度
transform.position += Vector3.up * 1.68 * Time.deltaTime;
}else if(haha==2){
transform.RotateAround(Vector3.zero, Vector3.up, 143 * Time.deltaTime); // 每秒143度
transform.position -= Vector3.up * 1.68 / 2.0 * Time.deltaTime;
} // if .. elseif ...
} // checkHaha(
/////// End here
//為了方便測試看出按 y 鍵(加或按下滑鼠左鍵)真的攻擊行動有效,
//稍微改一下: (可直接掛給一個 Cube 做測試)
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
private var haha: int = 0; // 用來表示殺敵狀態
function attackIt( ) {
// 殺他 :-) 通常是設定 殺敵動畫播放 為 true, 現在改用簡單狀態
haha = 1; // 殺出
yield WaitForSeconds(0.88f); // 讓砍殺出動作持續 0.88秒
haha = 2; // 返回
yield WaitForSeconds(1.76f); // 用 1.76秒抽回劍 :-)
haha = 0; // 攻擊完畢; 總共 0.88 + 1.76秒 < 5 秒所以 OK
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
checkHaha( ); // 看看是否要做模擬攻擊的事情
if (cooled) if(Input.GetKeyDown(KeyCode.Y) || Input.GetMouseButtonDown(0) ) {
attackIt( );
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
} // if 有按下 y 且在武器可用狀態
} // Update(
function checkHaha( ) {
if(haha == 1){
transform.RotateAround(Vector3.zero, Vector3.up, 123 * Time.deltaTime); // 每秒123度
transform.position += Vector3.up * 1.68 * Time.deltaTime;
}else if(haha==2){
transform.RotateAround(Vector3.zero, Vector3.up, 143 * Time.deltaTime); // 每秒143度
transform.position -= Vector3.up * 1.68 / 2.0 * Time.deltaTime;
} // if .. elseif ...
} // checkHaha(
/////// End here
補充說明第二版的五秒以上才可再次攻擊的 attackIt( ) 函數:
attackIt( ) 一發生立即設 haha = 1; 代表發出第一招式,
隨後的 yield WaitForSeconds(0.88f); haha=2;
意思是等過了 0.88 秒把 haha 改為 2 代表說要發出第二招式 !
再之後 yield WaitForSeconds(1.76f); haha=0;
意思是等過了 1.76秒把 haha 設為 0 代表攻擊動作已經結束!
那第一招與第2招各是啥?
此例子是在 Update( ) 裡面根據 haha 做事 !!
* 通常攻擊做法是利用 Animator, 程式只要設定角色的動畫狀態讓 Animator 控制器做事即可!
* 可以自己 Google 搜尋 Unity Animator Controller 看看;
但這裡我是用簡單方式在 Update( )展示 攻擊動作
很重要的一個概念是:
Unity 引擎相當於一個導演會要求所有的遊戲物件在一個畫面呈現之前快速做完該做的事!
所以, 每一個畫面(frame)之間主要是靠 Update( ) 做事, 且每次只能做一點點事!!
由於 Update( ) 大約每 0.01 秒就會被調用一次,
規定裡面不可以寫 yield 這類的句子!!!
那每次到 Update( ) 我怎知該做啥事呢?
在我這例子中, Update( ) 一開始會叫 checkHaha( ); 做一點點攻擊動作
在 checkHaha() 內依據 haha 的值(value)做事,
當 haha 是 1, 把角色用 RotateAround( )旋轉一點點,
並把角色的位置往上移動一點點
如果 haha 是 2, 繼續角色旋轉, 但位置往下移動一點點
請注意 haha 的值是 attackIt( ) 決定的
如果 haha 是其他值則 checkHaha( ); 不做任何事!
**再次提醒, haha 的值是在 attackIt( ) 負責改變!!
* 每次 attackIt( ) 被調用都會讓 haha 是 1維持 0.88秒再接著 haha是2維持1.76秒
呈現出的結果是角色會花 0.88 秒往上移動, 然後花 1.76秒往下回來到原高度!
**注意, 雖然被 Update( ) 調用的函數內可以寫 yield 這類句子,
但你的 Update( ) 內容要很小心寫,
千萬不可以每次都會調用該含有 yield 的函數(專業術語叫做 Coroutine)
**為何用 0.88 秒和 1.76秒, 我隨便寫的! 不然你咬我啊 :-)
attackIt( ) 一發生立即設 haha = 1; 代表發出第一招式,
隨後的 yield WaitForSeconds(0.88f); haha=2;
意思是等過了 0.88 秒把 haha 改為 2 代表說要發出第二招式 !
再之後 yield WaitForSeconds(1.76f); haha=0;
意思是等過了 1.76秒把 haha 設為 0 代表攻擊動作已經結束!
那第一招與第2招各是啥?
此例子是在 Update( ) 裡面根據 haha 做事 !!
* 通常攻擊做法是利用 Animator, 程式只要設定角色的動畫狀態讓 Animator 控制器做事即可!
* 可以自己 Google 搜尋 Unity Animator Controller 看看;
但這裡我是用簡單方式在 Update( )展示 攻擊動作
很重要的一個概念是:
Unity 引擎相當於一個導演會要求所有的遊戲物件在一個畫面呈現之前快速做完該做的事!
所以, 每一個畫面(frame)之間主要是靠 Update( ) 做事, 且每次只能做一點點事!!
由於 Update( ) 大約每 0.01 秒就會被調用一次,
規定裡面不可以寫 yield 這類的句子!!!
那每次到 Update( ) 我怎知該做啥事呢?
在我這例子中, Update( ) 一開始會叫 checkHaha( ); 做一點點攻擊動作
在 checkHaha() 內依據 haha 的值(value)做事,
當 haha 是 1, 把角色用 RotateAround( )旋轉一點點,
並把角色的位置往上移動一點點
如果 haha 是 2, 繼續角色旋轉, 但位置往下移動一點點
請注意 haha 的值是 attackIt( ) 決定的
如果 haha 是其他值則 checkHaha( ); 不做任何事!
**再次提醒, haha 的值是在 attackIt( ) 負責改變!!
* 每次 attackIt( ) 被調用都會讓 haha 是 1維持 0.88秒再接著 haha是2維持1.76秒
呈現出的結果是角色會花 0.88 秒往上移動, 然後花 1.76秒往下回來到原高度!
**注意, 雖然被 Update( ) 調用的函數內可以寫 yield 這類句子,
但你的 Update( ) 內容要很小心寫,
千萬不可以每次都會調用該含有 yield 的函數(專業術語叫做 Coroutine)
**為何用 0.88 秒和 1.76秒, 我隨便寫的! 不然你咬我啊 :-)
/// uuu.js 第三版 -- 重寫原先第二版的五秒以上才可再次攻擊
var cooled: boolean = true; // 代表武器冷的
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
private var haha: int = 0; // 用來表示殺敵狀態
function attackIt( ) {
// 殺他 :-) 通常是設定 殺敵動畫播放 為 true, 現在改用簡單狀態
haha = 1; // 殺出
yield WaitForSeconds(0.88f); // 讓砍殺出動作持續 0.88秒
haha = 2; // 返回
yield WaitForSeconds(1.76f); // 用 1.76秒抽回劍 :-)
haha = 0; // 攻擊完畢; 總共 0.88 + 1.76秒 < 5 秒所以 OK
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
checkHaha( ); // 看看是否要做模擬攻擊的事情
if(Input.GetKeyDown(KeyCode.Y) || Input.GetMouseButtonDown(0) ) {
if (cooled) { // 武器可用
attackIt( );
Debug.Log(" 乎死 !");
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
}else Debug.LogWarning("不要亂按 !!!"); // 因武器是不可用狀態
} // if 有按下 y 且在武器可用狀態
} // Update(
function checkHaha( ) {
if(haha == 1){
transform.RotateAround(Vector3.zero, Vector3.up, 123 * Time.deltaTime); // 每秒123度
transform.position += Vector3.up * 1.68 * Time.deltaTime;
}else if(haha==2){
transform.RotateAround(Vector3.zero, Vector3.up, 143 * Time.deltaTime); // 每秒143度
transform.position -= Vector3.up * 1.68 / 2.0 * Time.deltaTime;
} // if .. elseif ...
else {
}
} // checkHaha(
/////// End here
function ggyy( ) {
cooled = false; // 武器變熱, 在不允許使用的狀態
yield WaitForSeconds(5);
cooled = true; // 又冷了, 可用來殺人了 :-)
}
private var haha: int = 0; // 用來表示殺敵狀態
function attackIt( ) {
// 殺他 :-) 通常是設定 殺敵動畫播放 為 true, 現在改用簡單狀態
haha = 1; // 殺出
yield WaitForSeconds(0.88f); // 讓砍殺出動作持續 0.88秒
haha = 2; // 返回
yield WaitForSeconds(1.76f); // 用 1.76秒抽回劍 :-)
haha = 0; // 攻擊完畢; 總共 0.88 + 1.76秒 < 5 秒所以 OK
}
function Update( ) { // 我用 y 鍵敲下時來殺敵人 :-)
checkHaha( ); // 看看是否要做模擬攻擊的事情
if(Input.GetKeyDown(KeyCode.Y) || Input.GetMouseButtonDown(0) ) {
if (cooled) { // 武器可用
attackIt( );
Debug.Log(" 乎死 !");
StartCoroutine( ggyy( ) ); // 其實 JavaScript 直接寫 ggyy( ); 即可
}else Debug.LogWarning("不要亂按 !!!"); // 因武器是不可用狀態
} // if 有按下 y 且在武器可用狀態
} // Update(
function checkHaha( ) {
if(haha == 1){
transform.RotateAround(Vector3.zero, Vector3.up, 123 * Time.deltaTime); // 每秒123度
transform.position += Vector3.up * 1.68 * Time.deltaTime;
}else if(haha==2){
transform.RotateAround(Vector3.zero, Vector3.up, 143 * Time.deltaTime); // 每秒143度
transform.position -= Vector3.up * 1.68 / 2.0 * Time.deltaTime;
} // if .. elseif ...
else {
}
} // checkHaha(
/////// End here
////// JavaScript -- 移動物件
#pragma strict
var sp = 3.8f;
function Start () {
Debug.LogError("哈哈, 我是 " + gameObject.name);
}
function Update () {
if( gameObject.tag == "good" ) return;
var t = sp* Time.deltaTime;
transform.position.x -= t;
}
var sp = 3.8f;
function Start () {
Debug.LogError("哈哈, 我是 " + gameObject.name);
}
function Update () {
if( gameObject.tag == "good" ) return;
var t = sp* Time.deltaTime;
transform.position.x -= t;
}
//////// C# BBB.cs -- 移動物件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BBB : MonoBehaviour {
public float sp = 3.8f;
// Use this for initialization
void Start () {
Debug.LogWarning ("c8 xxxxxxxxxxxxxx c8 c8 ");
}
// Update is called once per frame
void Update () {
Vector3 ggyyt = new Vector3 ( sp* Time.deltaTime, 0 , 0 );
transform.position -= ggyyt;
}
}
using System.Collections.Generic;
using UnityEngine;
public class BBB : MonoBehaviour {
public float sp = 3.8f;
// Use this for initialization
void Start () {
Debug.LogWarning ("c8 xxxxxxxxxxxxxx c8 c8 ");
}
// Update is called once per frame
void Update () {
Vector3 ggyyt = new Vector3 ( sp* Time.deltaTime, 0 , 0 );
transform.position -= ggyyt;
}
}
碰撞與觸發OnTriggerEnter_OnCollisionEnter
-- by 蔡文能 [email protected]
//testTrigger.js -- by [email protected] // 觸發(Trigger)偵測, 注意其參數與碰撞(Collision)偵測的函數不相同喔 ! //OnTriggerEnter(other : Collider) -- 至少要有一方勾選 Is Trigger, // .. 且正在移動的物件要有剛體(Rigidbody) 才有作用! static var idName : String = "008007 張大千"; // static 使得腳本的各分身共用這變數! /// function OnTriggerEnter (other : Collider) { Debug.LogWarning("TriggerEnter, 我:"+ transform.name + ", him:" + other.transform.name); // 我: 當然是掛載這程式碼的物件; him: 對方 } // OnTriggerEnter( ////// function OnTriggerStay (other : Collider) { // 注意以下現在是註解掉 ! //Debug.Log("Stay Trigger, 我:"+ transform.name + ", him:" + other.transform.name); // 我: 當然是掛載這程式碼的物件; him: 對方 } // OnTriggerStay( function OnTriggerExit (other : Collider) { Debug.LogWarning("Trigger Exit, 我:"+ transform.name + ", him:" + other.transform.name); // 我: 當然是掛載這程式碼的物件; him: 對方 } // OnTriggerExit( ////////////////////////////// | ||
| ||
關於碰撞(Collision) -- -- 請看圖的上半部 OnCollisionEnter(other : Collision), Stay, Exit |
You are the -th visitors to this page. |