2D横版游戏Demo试做流程(Unity3D+Visual Studio C#)
2D橫版游戲Demo試做流程(Unity3D+Visual Studio C#)
- 目錄
- UI界面設置
- 游戲規則制定
- Player角色(玩家可控制角色相關)(創建playerC#文件)
- 怪物類(各種怪物相關)(創建MonsterC#文件)
- 獎勵物體類(金幣,無敵,攻擊等物品)
- 界面跳轉
- 發布
目錄
UI界面設置
通過各種途徑獲得相關UI元素,在Unity中左側欄中利用2D Project中元素完成場景。設置好各個物體所需的Box Collider 2d (碰撞)和 rigidBody 2d(物理屬性)。設置好不同物體的類型(tag)(例如角色、金幣、怪物、子彈等)后續碰撞檢測需要使用。
主場景
進入游戲界面
失敗和成功界面
其中還包括設置游戲內怪物和角色動畫。角色為UNITY社區中下載的包,已包含動畫。怪物使用關鍵幀動畫,創建動畫后,在ctri+6呼出的時間軸中添加關鍵幀。
游戲規則制定
在項目下新建Scriipt(代碼)文件夾,創建GameManager的C#文件。在該文件中制定游戲大體規則。
使用單例模式(餓漢子單例模式)創建各種變量。
public class GameManage : MonoBehaviour {//單例模式(餓漢子單例模式)public static GameManage Index; //靜態變量不能被實例化GameManage(){Index = this;}//工廠模式(內部所有組成成員的變量全部都是靜態變量)[Header("金幣值")]public int gold = 0;[Header("當前關卡")]public int Level = 1;/// <summary>/// 所有的音頻管理/// </summary>public AudioSource[] allAudio;/// <summary>/// 地面/// </summary>public GameObject Floor;/// <summary>/// 金幣顯示/// </summary>public Text Gold;/// <summary>/// 剩余時間顯示/// </summary>public Text TimeShow;float times = 300;/// <summary>/// 主角速度/// </summary>public float PlayerSpeed = 0.03f;/// <summary>/// 主角/// </summary>public GameObject KyaRa;/// <summary>/// 主角狀態 0為無防護/// </summary>public int PlayerState = 0;/// <summary>/// 顯示無敵圖標/// </summary>public GameObject PlayerIsSuper;/// <summary>/// 顯示主角武器/// </summary>public GameObject PlayerIsAttact;// Start is called before the first frame updatevoid Start(){PlayerIsSuper.SetActive(false);PlayerIsSuper.SetActive(false);}// Update is called once per framevoid Update(){times -= Time.deltaTime;TimeShow.text = times.ToString();} }Player角色(玩家可控制角色相關)(創建playerC#文件)
總體分為幾種功能
1、角色的各種狀態(創建各種變量標識主角狀態)
2、角色控制相關(通過鍵盤按鍵WASD移動,J攻擊操控角色)移動主要使用transform方法改變主角位置。在主角行走至屏幕中間時,改為地圖進行相對向后運動,主角位置不變。
void run(){//點擊D鍵向右移動if (Input.GetKey(KeyCode.D)){if (isPlayerRun){//控制跑動速度和位置transform.Translate(GameManage.Index.PlayerSpeed* - 1, 0, 0);}else{GameManage.Index.Floor.transform.Translate(GameManage.Index.PlayerSpeed * -1, 0, 0);}//控制人物面朝方向為向右transform.eulerAngles = new Vector3(0, 180, 0);if (IsOnFloor ){//播放跑步動畫anime.Play("run");}}//松開前進鍵播放站立動畫if (Input.GetKeyUp(KeyCode.D)){anime.Play("idle");}//點擊A鍵向左移動if (Input.GetKey(KeyCode.A)){transform.Translate(GameManage.Index.PlayerSpeed * -1, 0, 0);//控制人物面朝方向為向左transform.eulerAngles = new Vector3(0, 0, 0);if (IsOnFloor){//播放跑步動畫anime.Play("run");}}//松開前進鍵播放站立動畫if (Input.GetKeyUp(KeyCode.A)){anime.Play("idle");}//點擊W鍵控制跳躍if (IsOnFloor){if (Input.GetKeyDown(KeyCode.W)){//給定一個向上的力rigi.AddForce(new Vector2(0, 400));anime.Play("jump");}}//松開上鍵播放站立動畫if (Input.GetKeyUp(KeyCode.W)){anime.Play("idle");}}此外還要設定主角在跳躍過程中不能再進行二次跳躍。在開頭變量中設置有變量角色是否在地面上(利用碰撞信息進行判定)在角色控制中使用相關控制語句,在下方的碰撞檢測中更改相關變量。
3、角色攻擊相關
在角色吃到特定物品后,將GamaManager中的主角狀態變量更改,在判斷主角狀態為可攻擊狀態時,可以進行攻擊。
角色攻擊方法(創建一個子彈,并利用rigidBody 2d給其一個力使其移動,子彈的消失和碰撞到怪物殺死怪物消失,后續進行解釋)創建子彈使用Instantiate方法,在主角當前位置創建。
4、主角死亡的判定
利用碰撞檢測和得到的當前主角狀態(若為無敵狀態則不死亡)進行條件判斷,判斷角色是否死亡,利用switch判斷。
5、角色死亡方法(角色死亡為觸碰到怪物)
主體死亡方法為停止播放當前動畫,并播放死亡動畫和音頻,并利用延遲函數invoke調用兩個獨立的死亡方法。
主角死亡后向下掉落出地圖(通過改變BoxCollider 2D 的isTrigger屬性為true,讓主角下落)
void Die1(){this.gameObject.GetComponent<BoxCollider2D>().isTrigger = true;}主角死亡后界面需要跳轉
void Die2(){SceneManager.LoadScene("fail");}怪物類(各種怪物相關)(創建MonsterC#文件)
1、各種變量(包括記錄怪物種類,怪物生命值等的各種變量)
public int MonsterState = 0;//0是普通怪物 1是火圈 2是bosspublic Animator anime;public GameObject Fees;public float times = 2;public int BossLive = 10;2、設置不同怪物的移動方式和出場方法(普通怪物在和角色相距10f時開始向主角移動,boss在和角色相距10f是開始發射小型怪物)怪物發射小型怪物原理和上方主角發射攻擊原理相同。
if (MonsterState == 0){if (Vector3.Distance(GameManage.Index.KyaRa.transform.position, this.transform.position) <= 10f){this.transform.Translate(-0.03f, 0, 0);}}else if (MonsterState == 2){if (Vector3.Distance(GameManage.Index.KyaRa.transform.position, this.transform.position) <= 10f){times -= Time.deltaTime;if (times < 0){GameObject ss =Instantiate(Fees, this.transform.position, this.transform.rotation);//在player下創建子彈ss.GetComponent<Rigidbody2D>().AddForce(this.transform.right * 100 );times = 3;}}}3、怪物死亡判定。(根據怪物狀態,不同怪物情況不同,利用碰撞信息判定,判定觸碰到無敵狀態下的player或子彈都會死亡,boss設定攻擊次數。)利用tag輔助判斷到底觸碰到了什么物體。
void OnCollisionEnter2D(Collision2D collision){if (collision.collider.tag == "Player"){if (GameManage.Index.PlayerState == 2){Debug.Log("自己死亡");this.gameObject.GetComponent<BoxCollider2D>().isTrigger = true;GameManage.Index.allAudio[3].Play();}}else if (collision.collider.tag == "Attacts" && MonsterState == 0){Debug.Log("自己死亡");Destroy(this.gameObject);GameManage.Index.allAudio[3].Play();GameManage.Index.gold += 10;GameManage.Index.Gold.text = GameManage.Index.gold.ToString();}else if (collision.collider.tag == "Attacts" && MonsterState == 2){BossLive = BossLive - 1;if (BossLive == 0){Debug.Log("自己死亡");Destroy(this.gameObject);GameManage.Index.allAudio[3].Play();GameManage.Index.gold += 100;GameManage.Index.Gold.text = GameManage.Index.gold.ToString();}}else if (collision.collider.tag == "Player" && MonsterState == 1 && GameManage.Index.PlayerState <= 2){anime.Play("die");collision.gameObject.GetComponent<Players>().Die();}} }獎勵物體類(金幣,無敵,攻擊等物品)
1、設置變量(包括種類標識信息等)
public int state = 0;//0代表金幣1代表武器2代表無敵3代表子彈4代表火圈5代表傳送門int OldState = 0;2、根據情況設置不同的碰撞出發(OnTriggerEnter2D、OnCollisionEnter2D等,并根據tag輔助判斷碰撞物為角色)
private void Start(){if (state == 3){Invoke("Des", 1f);}}void Des(){Destroy(this.gameObject);}private void Update(){if (state == 4){transform.Rotate(0, 0, 0.3f);}}//碰撞檢測中的觸發器,進入觸發器區域private void OnTriggerEnter2D(Collider2D collision){if (collision.tag == "Player" && state == 0){GameManage.Index.gold += 1;GameManage.Index.Gold.text = GameManage.Index.gold.ToString();GameManage.Index.allAudio[1].Play();Destroy(this.gameObject);}else if (collision.tag == "Player" && state == 2){GameManage.Index.allAudio[5].Play();OldState = GameManage.Index.PlayerState;GameManage.Index.PlayerState = 2;GameManage.Index.PlayerIsSuper.SetActive(true);Invoke("SuperPlayerOver", 5f);Destroy(this.gameObject.GetComponent<SpriteRenderer>());//在沒有刪除物體的情況下,不讓其顯示Destroy(this.gameObject.GetComponent<BoxCollider2D>());}else if (collision.tag == "Player" && state == 1){GameManage.Index.allAudio[2].Play();GameManage.Index.PlayerIsAttact.SetActive(true);GameManage.Index.PlayerState = 1;Destroy(this.gameObject);}else if (collision.tag == "Player" && state == 5){SceneManager.LoadScene("clear");}}private void OnCollisionEnter2D(Collision2D collision){if (collision.collider.tag == "Monster"){Destroy(this.gameObject);}}void SuperPlayerOver(){GameManage.Index.PlayerState = 2;GameManage.Index.PlayerState = OldState;GameManage.Index.allAudio[5].Stop();GameManage.Index.PlayerIsSuper.SetActive(false);//設置是否顯示一個物體Destroy(this.gameObject);}界面跳轉
按鈕界面的跳轉使用了代碼進行完成
using UnityEngine.SceneManagement;public class Login : MonoBehaviour {//跳轉到制定程序public void GotoScene(string Name){SceneManager.LoadScene(Name);} }并需要在unity中設置按鈕相關的屬性來實現跳轉。
在代碼頭加入using UnityEngine.SceneManagement;后即可直接利用下方語句直接跳轉至相應界面
游戲內死亡和完成游戲,為一定條件下直接進行頁面跳轉,
在代碼頭加入using UnityEngine.SceneManagement;后即可直接利用下方語句直接跳轉至相應界面
注意:頁面跳轉需要在unity中building 里將所有SCENE添加到列表中才能實現!!!
發布
發布為webgl版本。在building中選擇webgl,根據提示下載相關組件,并進行項目的轉換。轉換完成后選擇building即可。
注意:項目所有的文件名和路徑名稱必須全部為英文。
注意:使用火狐瀏覽器打開,還需設置其webgl.force-enable為true
security.fileuri.strict_origin_policy為false才可運行。界面如下:
2d橫版游戲demo展示
總結
以上是生活随笔為你收集整理的2D横版游戏Demo试做流程(Unity3D+Visual Studio C#)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: filecoin工作原理
- 下一篇: 每日新闻丨马电信运营商与华为签署5G商