unity3d水果忍者制作
接着昨天的更新,代码实现模块的理解和实现,这里对ui和声音部分就不做过多解释,主要讲解游戏场景内代码的实现功能:
在一个游戏制作过程中预制体的巧妙使用和删减可以帮我们节省大量的时间和存储空间以及代码量,在切水果的游戏实现中体现的更为突出,水果需要不断地更新和被切后水果的删除这些利用预制体都能给我们减少大量的工作量。所以在制作过程中我们需要把各类水果和刀光剑影以及奖励提示图标都设置为预制体来让我们可以在过程中不断创建引用和删除。
还有切割成两半的预制体,以供我们在切割到水果后被分成两块调用。
好了接下来我们开始切割水果以及分数反馈代码的梳理和实现部分:
下面展示一些 内联代码片
。
void Update () {
if (Input.GetMouseButton(0))
{
//OverlapPoint方法用于检测2D场景中参数坐标上所有的碰撞体,这里我们的参数是鼠标点击的位置,
//因此我们用于判断是否点击到了水果来完成信息的反馈更新
if (Collider.OverlapPoint(Camera.main.ScreenToWorldPoint(Input.mousePosition)))
{
//cs0.是仓鼠对象,这里是玩家有五条生命格,如果切到了仓鼠则减去一条生命,如果不是的话则进入加分和其他的一些操作。
if (name != "cs0.(Clone)")
{
//jpg金苹果 作为游戏彩蛋切割到了加二十分
if (name == "jpg0.(Clone)")
{
GameObject add = Instantiate(GoldTip) as GameObject;//复制彩蛋特校为add对象
add.transform.position = transform.position;
//add彩蛋对象位于金苹果被切的位置,且在一秒后删除
//(这里的逻辑和方法希望大家能够仔细的去理解因为后面的代码实现功能都有这几句代码的影子)
Destroy(add, 1);
AudioSource.PlayClipAtPoint(GoldClip, transform.position);
ScoreManage1.scorenumber+=20;
//加20分在计分类scoremanage1的静态变量scorenumber中,同时播放一次彩蛋的音乐提示
}
else//如果不是金苹果彩蛋对象而是普通的水果则加一分
ScoreManage1.scorenumber+=1;
}
else//如果是仓鼠的话则扣去一条生命值且播放扣除生命的音乐提示
{
AudioSource.PlayClipAtPoint(FailClip, transform.position);
LifeManager1.life--;
}
//下面两句是将预制体调用起来的代码,大家只要理解刚刚创建金苹果的彩蛋对象下面都是一样的功能实现,首先是刀光的预制体复制;
//instantiate方法里参数一:是预设 参数二:实例化预设的坐标(即被切的水果位置出现刀光) 参数三:实例化预设的旋转角度(为了游戏美观选择一定角度的随机数)
//Quaternion.AngleAxis的第二个参数就是旋转轴,意思是在垂直相机平面的轴为旋转轴随机度数旋转
knifeRay = Instantiate(KnifeRay, transform.position, Quaternion.AngleAxis(Random.Range(-30f, 30f), Vector3.back)) as GameObject;
Destroy(knifeRay, 1);
//以下代码为创建水果代码同上不做赘述,写好后挂载在所有的水果预制体上即可
//下面两个apple变量是水果切除后原来的完整水果的预制体删除,同时将切成两半的水果预制体复制出来达到切除显示效果。
Destroy(this.gameObject);
GameObject apple1 = Instantiate(Apple1, transform.position, Quaternion.AngleAxis(Random.Range(-30f, 30f), Vector3.back)) as GameObject;
GameObject apple2 = Instantiate(Apple2, transform.position, Quaternion.AngleAxis(Random.Range(-30f, 30f), Vector3.back)) as GameObject;
apple1.GetComponent<Rigidbody2D>().velocity = new Vector2(Random.Range(-10, -5),Random.Range(2,3));
apple2.GetComponent<Rigidbody2D>().velocity = new Vector2(Random.Range(10, 5), Random.Range(2, 3));
GameObject wzt = Instantiate(wz[Random.Range(0, 3)]) as GameObject;
wzt.transform.position = transform.position;
//wzt是切除的果汁特效,这几句代码虽然很长但是理解了的话其实都是一个方法多次使用最后把所有的预制体都删除整个的游戏切除水果代码就完成了。
Destroy(wzt, 1);
Destroy(apple1, 2);
Destroy(apple2, 2);
}
}
}
整个游戏执着过程中因为有教材原素材所以工作量比较小,个人认为这一段就是整个游戏的核心代码了,再者就是对于生命值和分数的信息反馈和UI更新代码了这里不做过多赘述给大家参考一下就好,因为我只是参考了教材的这一段代码剩下的部分都是按照自己的想法和代码实现的,感觉有很多种方法和代码能实现难度不是很大所以不做过多赘述大家参考一下自己去写自己喜欢的代码就好。
下面展示一些 内联代码片
。
public class ScoreManage1 : MonoBehaviour {
public Image[] score;
public Sprite[] number;
public static int scorenumber = 0;
// Use this for initialization
void Start () {
}
public void UpdateScore()
{
score[0].GetComponent<Image>().sprite = number[scorenumber / 100];
score[1].GetComponent<Image>().sprite = number[scorenumber / 10];
score[2].GetComponent<Image>().sprite = number[scorenumber % 10];
}
// Update is called once per frame
void Update () {
UpdateScore();
}
}
public class LifeManager1 : MonoBehaviour {
public Image[] lifeImage;
public int lifeLength;
public static int life=5;
// Use this for initialization
void Start () {
lifeLength = lifeImage.Length;
}
public void SetLife()
{
for(int i=0; i<5-life; i++)
{
lifeImage[i].color = Color.red;
}
}
// Update is called once per frame
void Update () {
SetLife();
if(life==0)
{
Application.LoadLevel("gameover");
}
}
}
好了这就是整个游戏里代码部分了,主页面的ui代码也很简单大家自己写一下就好。