框架視圖
關(guān)鍵代碼
Bird
public class Bird : MonoBehaviour
{
//控制材料中的貼圖狀態(tài) 要知道計(jì)時(shí)器 每秒總幀數(shù) 幀數(shù)計(jì)算器
//定義計(jì)時(shí)器變量
public float timer = 0;
//定義幀數(shù)量 也就是每秒鐘要顯示幀數(shù)较锡;
public int frameNumber = 10;
//定義幀數(shù)計(jì)數(shù)器
public int frameCount = 0;
//定義兩個(gè)變量 是否播放動(dòng)畫 是否控制跳躍络它;
public bool animation = false;
public bool canJump = false;
void Start()
{
//添加剛體組件
//給剛體施加一個(gè)向右的力(速度)
// gameObject.GetComponent<Rigidbody>().velocity = new Vector3(5,0,0);
// gameObject.GetComponent<Rigidbody>().velocity = new Vector3(2, 0, 0);
//第二種加力的方法拍冠;
// gameObject.GetComponent<Rigidbody>().AddForce(Vector3.right*50,ForceMode.Force);
}
void Update()
{
//判斷是否是可以播放動(dòng)畫的時(shí)候
//if (animation)
//{
if (GameMannger._intance.gameState ==GameMannger.GAMESTATE_PLAYING)
{
//給一個(gè)恒定的速度掸茅,測(cè)試之用
//Vector3 vel = gameObject.GetComponent<Rigidbody>().velocity;
//gameObject.GetComponent<Rigidbody>().velocity = new Vector3(5, vel.y, vel.z);
//計(jì)時(shí)
timer += Time.deltaTime;
//如果時(shí)間超過每秒鐘顯示的總幀數(shù) 幀數(shù)++仪际;時(shí)間重新歸零
if (timer >= 1.0f / frameNumber)
{
//幀數(shù)++姑丑;
frameCount++;
// timer -= Time.deltaTime ;
timer -= Time.deltaTime + 0.05f; //加個(gè)時(shí)間讓她抖動(dòng)的慢點(diǎn)
//定義每幀的下標(biāo)陨晶;取余 framrcount++ 1/3取余是1 2/3取余是2 3/3取余是0 4/3 取余是1 5/3取余是2 6/3取余是0 或者理解理解成0查牌,1对碌,2荆虱,0,1朽们,2...
int frameIndex = frameCount % 3;
//更新材質(zhì)的 偏移值 X怀读;
//怎樣去設(shè)置這個(gè)偏移值 X 的屬性呢?
//獲取本游戲?qū)ο笙碌?渲染組件 的 材質(zhì)(材質(zhì)復(fù)數(shù)時(shí)是數(shù)組)的設(shè)置 貼圖偏移值 x
gameObject.GetComponent<Renderer>().material.SetTextureOffset("_MainTex", new Vector2(0.3333f * frameIndex, 0));//參數(shù)1:表示本材質(zhì)的主要貼圖(著色器的主要貼圖)骑脱,參數(shù)2:要改變的二維向量菜枷;
}
}
//判斷是否跳躍的時(shí)候才可以跳躍
//if (canJump)
//{
if (GameMannger._intance.gameState == GameMannger.GAMESTATE_PLAYING)
{
//判斷點(diǎn)擊鼠標(biāo) 給一個(gè)向上的速度 向上跳躍
if (Input.GetMouseButtonDown(0))
{
//添加聲音后按下跳躍時(shí)播放扇動(dòng)翅膀的聲音
gameObject.GetComponent<AudioSource>().Play();
//獲取當(dāng)前的速度;
Vector3 vel2 = gameObject.GetComponent<Rigidbody>().velocity;
//給y軸向上的速度叁丧;
gameObject.GetComponent<Rigidbody>().velocity = new Vector3(vel2.x, 5.0f, vel2.z);
}
}
}
/// <summary>
/// 激活小鳥的方法 用來發(fā)送方法來調(diào)用的啤誊;
/// </summary>
public void getLife() {
gameObject.GetComponent<Rigidbody>().useGravity = true;
gameObject.GetComponent<Rigidbody>().velocity = new Vector3(2,0,0);
}
/// <summary>
/// 接觸地面后 加大阻力 不讓小鳥再次滾動(dòng)岳瞭;
/// </summary>
/// <param name="coll"></param>
void OnCollisionEnter(Collision coll) {
// Debug.Log(coll.gameObject.name);
if (coll.gameObject.name == "back")
{
//this.gameObject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
this.gameObject.GetComponent<Rigidbody>().drag = 1000f;
this.gameObject.GetComponent<Rigidbody>().angularDrag = 1000f;
// Debug.Log(this.gameObject.name);
}
}
}
FollowBird
public class FollowBird : MonoBehaviour {
//跟隨相機(jī)
//定義一個(gè)游戲?qū)ο笥脕韺ふ倚▲B的
private GameObject bird;
//為跟隨位置定義好的變量
private Transform birdTransform;
//定義好一個(gè)偏移值的變量;
Vector3 offset;
void Start () {
//尋找游戲?qū)ο?小鳥 并且賦值蚊锹;
bird = GameObject.FindGameObjectWithTag("Player");//gameobject是單數(shù)瞳筏,不是復(fù)數(shù);
birdTransform = bird.transform;
//計(jì)算偏移值牡昆;
offset = gameObject.GetComponent<Transform>().position - birdTransform.position;
}
void Update () {
Vector3 birdPos = birdTransform.position;
//判斷不要將攝像機(jī)超出邊界姚炕;
if (birdPos.y>5f)//上界
{
birdPos.y = 5f;
}
if (birdPos.y<2.5f)
{
birdPos.y =2.5f;
}
//相機(jī)位置跟隨 不斷補(bǔ)償偏移值;
// gameObject.GetComponent<Transform>().position = birdTransform.position + offset;
gameObject.GetComponent<Transform>().position = birdPos + offset;
}
}
GameMannger
public class GameMannger : MonoBehaviour {
//定義游戲的狀態(tài)迁杨;
public static int GAMESTATE_MENU = 0;
public static int GAMESTATE_PLAYING = 1;
public static int GAMESTATE_END = 2;
//只有3個(gè)背景圖钻心,不斷循環(huán) 進(jìn)入背景2 的時(shí)候 把背景1移到背景3 中去
public Transform firstBG;
//每個(gè)管道口設(shè)置一個(gè)觸發(fā)器,闖過一個(gè)得一分铅协;
//定義一個(gè)分?jǐn)?shù)的變量;
public int score=0;
//定義一個(gè)游戲狀態(tài)
public int gameState = GAMESTATE_MENU;
//定義一個(gè)鳥的游戲?qū)ο?并在初始化時(shí)賦值
private GameObject bird;
//單例模式
public static GameMannger _intance;
void Awake() {
_intance = this; //單例模式模板 得到的是gamemannger類型摊沉;
//給鳥賦值狐史;
bird = GameObject.FindGameObjectWithTag("Player");
}
void Update() {
//判斷當(dāng)前的游戲狀態(tài);
if (gameState==GAMESTATE_MENU)
{
//判斷是否點(diǎn)擊屏幕
if (Input.GetMouseButtonDown(0))
{
//設(shè)置游戲的狀態(tài)
gameState = GAMESTATE_PLAYING;
//播放動(dòng)畫 和 是否能跳躍 對(duì)鳥設(shè)置重力
//bird.GetComponent<Rigidbody>().useGravity = true;
////添加X軸方向的力说墨;
//bird.GetComponent<Rigidbody>().velocity = new Vector3(1,0,0);
//綜上 我們可以封裝成一個(gè)方法 在此調(diào)用方法時(shí) 發(fā)送一個(gè)方法名骏全;
bird.SendMessage("getLife");
}
}
//判斷游戲是結(jié)束狀態(tài),把結(jié)束界面顯示出來尼斧;
if (gameState == GAMESTATE_END)
{
GameMenu._instance.gameObject.SetActive(true);//參數(shù)設(shè)置為true姜贡;
//把分?jǐn)?shù)轉(zhuǎn)遞給結(jié)束的界面 顯示最后得分
GameMenu._instance.UpdateScore(score);
}
}
}
GameMenu
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameMenu : MonoBehaviour {
//聲明持有兩個(gè)分?jǐn)?shù)引用的變量;
public GUIText bestScore;
public GUIText nowScore;
//聲明持有重新開始的游戲貼圖棺棵;
public GUITexture startTexture;
//單例模式
public static GameMenu _instance;
void Awake()
{
_instance = this;
this.gameObject.SetActive(false); //默認(rèn)是不調(diào)用的楼咳;
}
//更新分?jǐn)?shù)的方法 公開的 才可以調(diào)用
public void UpdateScore(float currentScore)
{
//用來獲取最高分?jǐn)?shù)的關(guān)鍵詞 piayerprefs;
float highScore = PlayerPrefs.GetFloat("score", 0);//參數(shù)1:通過key關(guān)鍵詞 score查找最高分?jǐn)?shù) 參數(shù)2:默認(rèn)是0烛恤;因?yàn)榈谝淮螞]有最高分?jǐn)?shù)母怜,默認(rèn)值設(shè)置為0;
//判斷一下 現(xiàn)在傳過來的分?jǐn)?shù)跟最高分?jǐn)?shù)對(duì)比缚柏,更新下最高分苹熏;
if (highScore < currentScore)
{
highScore = currentScore;
}
//用來保存最高分?jǐn)?shù)的關(guān)鍵詞 PlayerPrefs;
PlayerPrefs.SetFloat("score", highScore);
//將分?jǐn)?shù)顯示出來币喧;
bestScore.text = highScore.ToString();
nowScore.text = currentScore.ToString();
//這個(gè)方法會(huì)被GameMannger調(diào)用
//判斷結(jié)束界面之后重新開始轨域;
//首先判斷鼠標(biāo)點(diǎn)下和游戲處于結(jié)束狀態(tài)
if (Input.GetMouseButtonDown(0)&&GameMannger._intance.gameState==GameMannger.GAMESTATE_END)
{
//獲取重新開始游戲貼圖的位置 關(guān)鍵語句 GetScreenRect()
Rect rect = startTexture.GetScreenRect();
//再次判斷點(diǎn)擊的位置是否在區(qū)域范圍內(nèi);
//先獲取鼠標(biāo)的位置
Vector3 mousePos=Input.mousePosition;
//判斷鼠標(biāo)點(diǎn)擊的范圍
if (mousePos.x>rect.x&&
mousePos.x<(rect.x+rect.width)&&
mousePos.y>rect.y&&
mousePos.y<(rect.y+rect.height)
)
{
////改變游戲狀態(tài)杀餐;
//GameMannger._intance.gameState = GameMannger.GAMESTATE_PLAYING;
////隱藏本界面
//this.gameObject.SetActive(false); //默認(rèn)是不調(diào)用的干发;
//重新加載場(chǎng)景
SceneManager.LoadScene(0);
}
}
}
}
MoveTrigger
public class MoveTrigger : MonoBehaviour {
//定義一個(gè)公開的背景
public Transform currentBG;
//定義持有兩個(gè)管道的應(yīng)用
public Pipe pipe1;
public Pipe pipe2;
//觸發(fā)事件 看誰觸發(fā)了我,判斷后 將背景1 移到背景2去
public void OnTriggerEnter(Collider coll) {
if (coll.tag=="Player")
{
//第一步 得到放在游戲管理器的第一個(gè)bg的Transform怜浅;
Transform firstBg=GameMannger._intance.firstBG;
//第二步 移動(dòng)铐然; 改變位置蔬崩;
currentBG.transform.position = new Vector3(firstBg.position.x+10f,currentBG.transform.position.y,currentBG.transform.position.z);
//第三部 把背景圖更新為當(dāng)前的位置;
GameMannger._intance.firstBG = currentBG;
//第四步 隨機(jī)生成管道的位置搀暑;
//定義 持有管道的引用 調(diào)用起方法生成隨機(jī)位置沥阳;
pipe1.RandomGeneratePosition();
pipe2.RandomGeneratePosition();
}
}
}
Pipe
public class Pipe : MonoBehaviour {
void Start () {
//測(cè)試是否隨機(jī);
RandomGeneratePosition();
}
/// <summary>
/// 讓Y軸的位置隨機(jī) 隨機(jī)范圍是-0.1至-0.4自点;
/// </summary>
public void RandomGeneratePosition() {
float pos_Y = Random.Range(-0.4f,-0.1f); //參數(shù)1:最小值 參數(shù)2:最大值桐罕;
//本地坐標(biāo)
gameObject.transform.localPosition = new Vector3(gameObject.transform.localPosition.x,pos_Y,gameObject.transform.position.z);
}
/// <summary>
/// 判斷是否通過管道,加一分
/// </summary>
void OnTriggerExit(Collider coll) { //觸犯3 個(gè)事件 OnTriggerEnter OnTriggerStay OnTriggerExit
if (coll.tag=="Player")
{
//播放得分聲音
gameObject.GetComponent<AudioSource>().Play();
//加分 調(diào)用單例模式靜態(tài)的方法 的分?jǐn)?shù)++
GameMannger._intance.score++;
}
}
/// <summary>
/// ongui事件
/// </summary>
void OnGUI() {
//顯示分?jǐn)?shù)桂敛;
// GUILayout.Label(GameMannger._intance.score.ToString());
GUILayout.Label("Score:"+GameMannger._intance.score);
}
}
PipeCollision
public class PipeCollision : MonoBehaviour {
//定義兩個(gè) 碰撞的聲音 小鳥結(jié)束的聲音 的變量
public AudioSource hitMusic;
public AudioSource dieMusic;
/// <summary>
/// 檢測(cè)小鳥碰撞到管道功炮,游戲結(jié)束 在結(jié)束前播放碰撞的聲音
/// </summary>
void OnCollisionEnter(Collision coll)
{
if (coll.gameObject.tag == "Player")
{
//播放碰撞的聲音
//gameObject.GetComponent<AudioSource>().Play();
hitMusic.Play();
//播放小鳥結(jié)束的聲音
dieMusic.Play();
//切換游戲狀態(tài)
GameMannger._intance.gameState = GameMannger.GAMESTATE_END;
}
}
}