Unity3D sintetizando sandía grande
1.Tipo de fruta
using UnityEngine;
public enum FruitType
{
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
Nine = 8,
Ten = 9,
Eleven = 10,
}
/// <summary>
/// 默认Ready
/// 创建出来待命的时候以及鼠标控制移动位置时候,StandBy
/// 跌落,Dropping
/// 碰撞到地板或者其它水果,Collision
/// </summary>
public enum FruitState
{
Ready = 0,
StandBy = 1,
Dropping = 2,
Collision = 3,
}
public class Fruit : MonoBehaviour
{
//Unity,在脚本中Public的变量或者参数,可以在Unity引擎,Inspector检查器视图中可视化的修改
public FruitType fruitType = FruitType.One;
private bool IsMove = false;
public FruitState fruitState = FruitState.Ready;
public float limit_x = 2f;
public Vector3 originalScale = Vector3.zero;
public float scaleSpeed = 0.1f;
public float fuirtScore = 1f;
void Awake()
{
originalScale = new Vector3(0.5f, 0.5f, 0.5f);
}
// Use this for initialization
//在游戏对象启用的时候,调用一次
void Start()
{
}
// Update is called once per frame
//更新方法,每帧执行一次,每帧的时间可以设置Time.deltaTime
void Update()
{
//游戏状态StandBy&水果状态StandBy,可以鼠标点击控制移动,以及松开鼠标跌落
if (GameManager.gameManagerInstance.gameState == GameState.StandBy && fruitState == FruitState.StandBy)
{
if (Input.GetMouseButtonDown(0))
{
IsMove = true;
}
//松开鼠标
if (Input.GetMouseButtonUp(0) && IsMove)
{
IsMove = false;
//改变重力,让水果自己掉落
this.gameObject.GetComponent<Rigidbody2D>().gravityScale = 1.0f;
fruitState = FruitState.Dropping; //Fruit Step 2
GameManager.gameManagerInstance.gameState = GameState.InProgress; //Step2
//创建新的待命水果
GameManager.gameManagerInstance.InvokeCreateFruit(0.5f);
}
if (IsMove)
{
//移动位置
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); //屏幕坐标转换成Unity世界坐标
this.gameObject.GetComponent<Transform>().position = new Vector3(mousePos.x,
this.gameObject.GetComponent<Transform>().position.y,
this.gameObject.GetComponent<Transform>().position.z);
}
}
//x方向的范围进行一个限制
if (this.transform.position.x > limit_x)
{
this.transform.position = new Vector3(limit_x, this.transform.position.y, this.transform.position.z);
}
if (this.transform.position.x < -limit_x)
{
this.transform.position = new Vector3(-limit_x, this.transform.position.y, this.transform.position.z);
}
//尺寸恢复
if (this.transform.localScale.x < originalScale.x)
{
this.transform.localScale += new Vector3(1, 1, 1) * scaleSpeed;
}
if (this.transform.localScale.x > originalScale.x)
{
this.transform.localScale = originalScale;
}
}
//碰撞
/// <summary>
/// Frui的游戏对象碰撞到Collision时候
/// 会一直不停的执行监测
/// 每个水果身上都会有碰撞监测
/// </summary>
/// <param name="collision"></param>
void OnCollisionEnter2D(Collision2D collision)
{
if (fruitState == FruitState.Dropping)
{
//碰撞到Floor
if (collision.gameObject.tag.Contains("Floor"))
{
GameManager.gameManagerInstance.gameState = GameState.StandBy;
fruitState = FruitState.Collision; //Fruit Step 3
GameManager.gameManagerInstance.hitSource.Play();
}
//碰撞到Fruit
if (collision.gameObject.tag.Contains("Fruit"))
{
GameManager.gameManagerInstance.gameState = GameState.StandBy;
fruitState = FruitState.Collision; //Fruit Step 3
}
}
//Dropping,Collision,可以进行合成
if ((int) fruitState >= (int) FruitState.Dropping)
{
if (collision.gameObject.tag.Contains("Fruit"))
{
if (fruitType == collision.gameObject.GetComponent<Fruit>().fruitType && fruitType != FruitType.Eleven)
{
//限制只执行一次合成
float thisPosxy = this.transform.position.x + this.transform.position.y;
float collisionPosxy = collision.transform.position.x + collision.transform.position.y;
if (thisPosxy > collisionPosxy)
{
//合成,在碰撞的位置生成新的大一号水果,尺寸由小变大
//两个位置信息,fruitType
GameManager.gameManagerInstance.CombineNewFruit(fruitType, this.transform.position,
collision.transform.position);
//分数
GameManager.gameManagerInstance.TotalScore += fuirtScore;
GameManager.gameManagerInstance.totalScore.text =
GameManager.gameManagerInstance.TotalScore.ToString();
Destroy(this.gameObject);
Destroy(collision.gameObject);
}
}
}
}
}
}
2.GameManager
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 默认Ready;
/// 点击开始到鼠标点击控制水果位置,StandBy;
/// 松开鼠标水果跌落,InProgress
/// 水果跌落碰撞到地板或者其它水果之后,回滚StandBy
/// 水果超出边界,GameOver
/// 游戏结束之后,延迟0.5s,计算分数 CalculateScore
/// </summary>
public enum GameState
{
Ready = 0,
StandBy = 1, //StandBy~Inprogress
InProgress = 2, //Inprogress~StandBy
GameOver = 3,
CalculateScore = 4,
}
public class GameManager : MonoBehaviour
{
public GameObject[] fruitList;
public GameObject bornFruitPosition;
public GameObject startBtn;
public static GameManager gameManagerInstance; //静态的实例,可以直接在别的类中使用
public GameState gameState = GameState.Ready;
public Vector3 combineScale = new Vector3(0, 0, 0);
public float TotalScore = 0f;
public Text totalScore;
public Text highestScoreText;
public AudioSource combineSource;
public AudioSource hitSource;
//在游戏对象启用之前,调用一次
void Awake()
{
gameManagerInstance = this;
}
// Use this for initialization
//在游戏对象启用的时候,调用一次
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void StartGame()
{
//游戏开始
Debug.Log("start");
float highestScore = PlayerPrefs.GetFloat("HighestScore");
highestScoreText.text = "历史最高:" + highestScore;
CreateFruit();
gameState = GameState.StandBy; //step1
startBtn.SetActive(false);
}
public void InvokeCreateFruit(float invokeTime)
{
Invoke("CreateFruit", invokeTime);
}
//待命水果无重力
public void CreateFruit()
{
int index = Random.Range(0, 5); //0,1,2,3,4
if (fruitList.Length >= index && fruitList[index] != null)
{
GameObject fruitObj = fruitList[index];
var currentFruit = Instantiate(fruitObj, bornFruitPosition.transform.position, fruitObj.transform.rotation);
currentFruit.GetComponent<Fruit>().fruitState = FruitState.StandBy; //Fruit Step1
}
}
/// <summary>
///
/// </summary>
/// <param name="currentFruitType">当前碰撞的水果类型</param>
/// <param name="currentPos">当前碰撞的水果位置</param>
/// <param name="collisionPos">碰撞的对方位置</param>
/// 合成的水果需要有重力
public void CombineNewFruit(FruitType currentFruitType, Vector3 currentPos, Vector3 collisionPos)
{
Vector3 centerPos = (currentPos + collisionPos) / 2;
int index = (int) currentFruitType + 1;
GameObject combineFruitObj = fruitList[index];
var combineFruit = Instantiate(combineFruitObj, centerPos, combineFruitObj.transform.rotation);
combineFruit.GetComponent<Rigidbody2D>().gravityScale = 1f;
combineFruit.GetComponent<Fruit>().fruitState = FruitState.Collision;
combineFruit.transform.localScale = combineScale;
combineSource.Play();
}
}
3.Línea superior
using UnityEngine;
using UnityEngine.SceneManagement;
public class TopLine : MonoBehaviour
{
public bool IsMove = false;
public float speed = 0.1f;
public float limit_y = -5f;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
if (IsMove)
{
if (this.transform.position.y > limit_y)
{
this.transform.Translate(Vector3.down * speed);
}
else
{
IsMove = false;
Invoke("ReLoadScene", 1f); //重新加载游戏
}
}
}
//碰撞触发
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.tag.Contains("Fruit"))
{
Debug.Log("topLinefruit");
//判断游戏是否结束
if ((int) GameManager.gameManagerInstance.gameState < (int) GameState.GameOver)
{
//并且十Collision状态的水果
if (collider.gameObject.GetComponent<Fruit>().fruitState == FruitState.Collision)
{
//GameOver
GameManager.gameManagerInstance.gameState = GameState.GameOver;
Invoke("OpenMoveAndCalculateScore", 0.5f);
//销毁剩余水果,计算分数
}
}
//计算分数
if (GameManager.gameManagerInstance.gameState == GameState.CalculateScore)
{
Debug.Log("fenshu");
float currentScore = collider.GetComponent<Fruit>().fuirtScore;
GameManager.gameManagerInstance.TotalScore += currentScore;
GameManager.gameManagerInstance.totalScore.text = GameManager.gameManagerInstance.TotalScore.ToString();
Destroy(collider.gameObject);
}
}
}
//打开红线向下移动的开关,并且gameState状态变为CalculateScore
void OpenMoveAndCalculateScore()
{
IsMove = true;
GameManager.gameManagerInstance.gameState = GameState.CalculateScore;
}
void ReLoadScene()
{
//设置历史最高分
float highestScore = PlayerPrefs.GetFloat("HighestScore");
if (highestScore < GameManager.gameManagerInstance.TotalScore)
{
PlayerPrefs.SetFloat("HighestScore", GameManager.gameManagerInstance.TotalScore);
}
SceneManager.LoadScene("HCDXG2021");
}
}