笔记23 Unity项目:超级玛丽
生活随笔
收集整理的這篇文章主要介紹了
笔记23 Unity项目:超级玛丽
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
筆記23 Unity項目:超級瑪麗
- 拖放地圖,裁剪精靈,形成跑步動畫,精靈渲染器
- 攝像機跟隨+代碼CameraControl
- 瑪里奧動畫
- 給馬里奧、地面等添加碰撞器、剛體(注意是2D的!)
- 添加音樂播放器+代碼AudioManager
- 檢測是否與地面碰撞(有兩種方法)
- 法一:利用射線檢測是否碰到地面(適用此游戲)
- 法二:不通過射線(不適用此游戲)
- 敵人蘑菇+代碼EnemyControl
- 代碼:馬里奧PlayControl
- 補充
- 使用字符串(即動畫名字)播放動畫
- 將名稱(字符串)轉成ID后使用
- 靜態金幣+代碼CoinStatic
- 磚塊+代碼RockControl
- 箱子、頂出動態金幣+二者代碼
- 代碼:箱子BoxControl
- 代碼:動態金幣CoinControl
- 頂箱子,頂出其他東西
- 老師說要進行拓展練習(暫空)
- 小記:《馬里奧、〈白夜行〉、我》
拖放地圖,裁剪精靈,形成跑步動畫,精靈渲染器
攝像機跟隨+代碼CameraControl
//跟隨的物體public Transform target;//最小邊界(能到的最左邊)public float minX;//最大邊界(能到的最右邊)public float maxX;void Update () {//獲取當前位置Vector3 pos = transform.position;//將它的x改成目標的xpos.x = target.position.x;//邊界判斷。需要傳入兩個邊界if(pos.x > maxX){pos.x = maxX;}if(pos.x < minX){pos.x = minX;}//再賦值回去transform.position = pos;}瑪里奧動畫
給馬里奧、地面等添加碰撞器、剛體(注意是2D的!)
添加音樂播放器+代碼AudioManager
//音頻播放器有了,首先寫成單例類。public static AudioManager Instance;//寫出兩個播放器(背景音、音效)。然后到unity里關聯(背景音,循環打鉤)。public AudioSource bgmPlayer;public AudioSource sePlayer;void Awake(){//單例類一定要在Awake里面賦值。因為這個方法調用的時機比Start靠前。//這樣可以保證在第一時間把這個單例做成。Instance = this;}// 下面給三個方法//一個播放bgm。傳進來一個name,就是你播放的文件名稱public void PlayMusic(string name){//如果當前沒有播放,再去播放if (bgmPlayer.isPlaying == false){/*加載音頻資源。類型AudioClip。從哪個位置加載?直接把name(外界傳進來的)放那就可以了。*/AudioClip clip = Resources.Load<AudioClip>(name);//更換當前播放的聲音片段bgmPlayer.clip = clip;//播放PlaybgmPlayer.Play();}}//停止播放public void StopMusic(){bgmPlayer.Stop();}//播放音效public void PlaySound(string name){/*加載音頻資源。類型AudioClip。從哪個位置加載?直接把name(外界傳進來的)放那就可以了。*/AudioClip clip = Resources.Load<AudioClip>(name);//播放音效sePlayer.PlayOneShot(clip);}檢測是否與地面碰撞(有兩種方法)
法一:利用射線檢測是否碰到地面(適用此游戲)
//利用射線檢測是否碰到地面(法一)//畫出射線。從中心點出發,向下*0.1米。Debug.DrawRay(transform.position, Vector2.down * 0.1f);/*創建2d射線。特點:可以直接返回。3d返回的是布爾值,hit在上面,利用out給hit值。而且在括號里可以直接填寫射線的起點,方向,距離,檢測的層(此處是第8層)。*/RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down ,0.1f,1<<8);if(hit.collider != null){//說明碰到地面了isGround = true;//把跳躍的動畫關閉ani.SetBool("Jump", false);}else{//沒碰到地面(在空中)isGround = false;ani.SetBool("Jump", true);}法二:不通過射線(不適用此游戲)
//判斷是否碰撞到地面(法二)。此處不適用,比如碰到左邊碰撞體,可以二段跳。private void OnCollisionEnter2D(Collision2D collision){if (collision.collider.tag == "Ground"){isGround = true;}}private void OnCollisionExit2D(Collision2D collision){if (collision.collider.tag == "Ground"){isGround = false;}}敵人蘑菇+代碼EnemyControl
拖放,添加碰撞器、剛體,添加動畫,編寫代碼,形成預設體。
代碼:馬里奧PlayControl
//人物的血量public int Hp = 1;//是否在地面private bool isGround = false;//剛體private Rigidbody2D rBody;//動畫private Animator ani;//獲取精靈圖片(為了后面翻轉圖片)private SpriteRenderer sr;void Start () {//在此處拿到這兩個組件rBody = GetComponent<Rigidbody2D>();ani = GetComponent<Animator>();sr = GetComponent<SpriteRenderer>();}void Update () {if (Hp <= 0){return;}//因為人物只是左右跑,所以拿水平軸float horizontal = Input.GetAxis("Horizontal");//如果水平軸不為0if (horizontal != 0){//前進transform.Translate(transform.right * Time.deltaTime * 1 * horizontal);//翻轉圖片(模擬轉頭)if (horizontal > 0){//說明是往右邊走所以不翻轉sr.flipX = false;}if (horizontal < 0){sr.flipX = true;}//移動動畫ani.SetBool("Run", true);}else{ani.SetBool("Run", false);}//跳躍。按了I鍵,并且人物是站在地上的。if (Input.GetKeyDown(KeyCode.I) && isGround == true){//跳躍力(向上,作用在剛體上)rBody.AddForce(Vector2.up * 200);//播放跳的聲音AudioManager.Instance.PlaySound("跳");}//利用射線檢測是否碰到地面(法一)//畫出射線。從中心點出發,向下*0.1米。Debug.DrawRay(transform.position, Vector2.down * 0.1f);/*創建2d射線。特點:可以直接返回。3d返回的是布爾值,hit在上面,利用out給hit值。而且在括號里可以直接填寫射線的起點,方向,距離,檢測的層(此處是第8層)。*/RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.1f, 1<<8);if(hit.collider != null){//說明碰到地面了isGround = true;//把跳躍的動畫關閉ani.SetBool("Jump", false);}else{//沒碰到地面(在空中)isGround = false;ani.SetBool("Jump", true);} }//玩家的死亡方法,因為在敵人的代碼里調用,所以此處是publicpublic void Die(){Hp--;if (Hp <= 0){//死亡ani.SetTrigger("Die");//刪除碰撞器。(因為玩家死亡時,是從場景中掉落的,所以只要刪除碰撞器,不刪剛體)。Destroy(GetComponent<Collider2D>());//停止播放背景音樂AudioManager.Instance.StopMusic();//播放死亡音樂AudioManager.Instance.PlaySound("死亡");//讓玩家靜止rBody.velocity = Vector2.zero;//讓玩家靜止,即將它的速度設為0。為了避免玩家在不同情況下死亡后,向上跳的高度不同)rBody.velocity = Vector2.zero;//跳躍。給一個向上的力rBody.AddForce(Vector2.up * 150f);//延時。1秒之后播放Invoke("Die2", 1f);}}void Die2(){AudioManager.Instance.PlaySound("死亡2");}補充
使用字符串(即動畫名字)播放動畫
////移動動畫ani.SetBool("Run", true);將名稱(字符串)轉成ID后使用
每個動畫都有一個ID。
因為系統開辟字符串比開辟整形更加費性能,如果一個動作需要多次使用,優化方法:
在最開始的時候(Start里),把動作都轉成int類型,用的時候,只要用int類型就好。
靜態金幣+代碼CoinStatic
//觸發private void OnTriggerEnter2D(Collider2D collision){if(collision.tag == "Player"){//播放聲音AudioManager.Instance.PlaySound("金幣");//銷毀自己Destroy(gameObject);}}磚塊+代碼RockControl
//大磚塊public GameObject Rock;//小磚塊public GameObject[] Rocks;//寫完上面的代碼,需要到unity里面關聯一下。// Use this for initializationvoid Start () {}private void OnCollisionEnter2D(Collision2D collision){//如果玩家碰了我,并且碰撞點的法線向上(說明玩家是從線面碰到的)if (collision.collider.tag == "Player" && collision.contacts[0].normal == Vector2.up){//播放音樂AudioManager.Instance.PlaySound("頂破磚");//小磚塊會四散開來。首先遍歷一下foreach(GameObject rock in Rocks){//把父物體(大磚塊)設置為空,小磚塊就沒有父物體了,會顯示在前面rock.transform.parent = null;//3D有爆炸力,2D沒有。首先,添加剛體。rock是4個小磚塊Rigidbody2D rbody = rock.AddComponent<Rigidbody2D>();//得到從整體的中心點到各個小磚塊中心點的向量。Vector2 dir = rock.transform.position - transform.position;//給力。dir沿著這個向量的方向*100的力rbody.AddForce(dir * 900f);//1秒之后銷毀Destroy(rock, 1f);}//銷毀大磚塊Destroy(gameObject);}}箱子、頂出動態金幣+二者代碼
代碼:箱子BoxControl
//血量。(頂幾次)public int Hp = 5;//頂出來的物體public GameObject goPre;//音效名稱(傳進來)public string sound; void Start () {}private void OnCollisionEnter2D(Collision2D collision){//如果玩家從下面頂撞if (collision.collider.tag == "Player" && collision.contacts[0].normal == Vector2.up){if(Hp > 0){Hp--;//頂出物品//聲音AudioManager.Instance.PlaySound(sound);//實例化物品Instantiate(goPre, transform.position, Quaternion.identity);if(Hp <= 0){//變成磚塊(就是下面的“沒了”)//獲得動畫GetComponent<Animator>().SetTrigger("Die");}}else{//箱子已經沒了。//播放沒了的聲音AudioManager.Instance.PlaySound("頂磚石塊");}}}代碼:動態金幣CoinControl
void Start () {//獲得剛體GetComponent<Rigidbody2D>().AddForce(Vector2.up * 150f);//銷毀金幣Destroy(gameObject, 1f);}頂箱子,頂出其他東西
老師說要進行拓展練習(暫空)
小記:《馬里奧、〈白夜行〉、我》
總結
以上是生活随笔為你收集整理的笔记23 Unity项目:超级玛丽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于计算机上使用的光盘,电脑中使用Win
- 下一篇: 关于超链接