赞
踩
首先因为只是一个小游戏,所以将游戏改为单屏就好。
点击File,选中Build Settings 选中默认得PC,下方有一个Player Settings,点击后,Inspactor面板中会出现Resolution选项,去掉Default Is Full Screen选中状态,自己修改合适屏幕大小。
找到Display Resolution Dialog,选为Disabled。
开始按钮制作。同理。
左侧的控制面板,主要用到了Text,Image,Taggle,Taggle Control,Shadow,outline几个属性,就是布局的操作,知道方法后不是很难
首先想一想,蛇在移动过程中需要些什么变量。方向、速度、每次移动距离。
public int step;private int dx,dy;public float speed=0.4f;
一个实时可以移动蛇的函数move
hpos = gameObject.transform.localPosition;
gameObject.transform.localPosition = new Vector(hpos.x+dx,hpos.y+dy,hpos.z);
一个可以不间断调用move函数的函数InvokeRepeating(“move”,0,speed);
上面的意思就是每个speed时间就调用一次move函数,将蛇向指定位置移动step距离的长度。
移动代码
//加速功能,先停止调用,在重新指定速度调用
if (Input.GetKeyDown(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating("Move", 0, speed - 0.15f);
}
if (Input.GetKeyUp(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating("Move", 0, speed);
}
//常识,你向上走的时候,不能向下走,不然会和自己的身体相撞
if (Input.GetKey(KeyCode.W) && dy != -step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
dx = 0; dy = step; //x轴不变,y轴向上每一移动step的距离
}
if (Input.GetKey(KeyCode.A) && dx != step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 90);
dx = -step; dy = 0;
}
if (Input.GetKey(KeyCode.S) && dy != step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 180);
dx = 0; dy = -step;
}
if (Input.GetKey(KeyCode.D) && dx != -step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, -90);
dx = step; dy = 0;
}
如此蛇的移动就完成了。
我们游戏界面的大小不是固定的,需要自己数清,我的是上下11格,右边19格,左边13格。每一格的大小是30*30,所以我们生成的食物位置。
public int xlimit = 19;
public int ylimit = 11;
public int xoffset = 6;
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
完整代码如下:
public int xlimit = 19;
public int ylimit = 11;
public int xoffset = 6;
public GameObject prefabFood;
public Sprite[] foodSprites; //存放图片数组
private Transform foodHolder;
void Start()
{
foodHolder = GameObject.Find("FoodManage").transform;
CreateFood();
}
public void CreateFood()
{
int index = Random.Range(0, foodSprites.Length); //随机生成食物图片
GameObject food = Instantiate(prefabFood); //生成食物预制体
//获得食物图片 要加UntiyEngine.UI头文件
food.GetComponent<Image>().sprite=foodSprites[index]; food.transform.SetParent(foodHolder, false); //不让Uniyt自动转图片位置
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
}
在第一个脚本中添加代码
private void OnTriggerEnter2D(Collider2D collision)
{
//等价于 collision.gameObject.CompareTag("food"); //标签名称是food
if(collision.tag == "food"){
Destroy(collision.gameObject); //销毁物体
FoodManager.Instance.CreateFo0d(); //创建食物
}
}
就可以了
这需要一个list数组,每当生成一个蛇身都放入到这个数组中去,因为蛇需要移动,而每一节身体的移动,我们都是后一个身体到原本前一个身体的位置去,所以用数组可以很好的解决。当然也有简单的解决办法,但是这里的蛇身体时奇偶变化的,所以用不了。
蛇身体的两张图片需要相应的存储起来,每吃下一个食物,判断蛇身体个数的奇偶性,再去添加相应的身体图片。
public List<Transform> bodyList = new List<Transform>(); //存放蛇的身体
public GameObject bodyPrefab; //生成蛇身体的
public Sprite[] bodySprites = new Sprite[2]; //蛇身体图片,奇偶区别
void Grow()
{
//AudioSource.PlayClipAtPoint(eatClip, Vector3.zero);
int index = (bodyList.Count % 2 == 0) ? 0 : 1;
GameObject body = Instantiate(bodyPrefab,new Vector3(1280,720,0),Quaternion.identity)as
GameObject;
body.GetComponent<Image>().sprite = bodySprites[index];
body.transform.SetParent(canvas, false);
bodyList.Add(body.transform);
}
If(Random.Range(1,10000) < 1000){
GameObject reward = Instantiate(perfabreward);
Reward.transform.SetParent(foodHolder,false);
Int dx = Random.Range(-xlimit + xoffset,xlimit);
Int dy = Random.Range(-ylimit,ylimit);
Reward.transform.localPosition = new Vector3(dx * 30,dy * 30,0);
}
分数和长度,分别存在于两个Text文本中,我们只需要得到他的控制就可以认为的改变里面的数值。
主要是每次蛇吃下食物以后,都需要更新分数和长度。所以我们就需要将控制分数的脚本写一个单利模式,可以使用该脚本中的函数,但不会修改里面的内容。
背景颜色也就是判断分数段,switch或者if else嵌套都可以解决。
暂停游戏简单,难的是你要想到游戏暂停的时候。任何关于蛇的操作都应该停止。Time.timeScale = 0;就是硬性使程序暂停。
返回菜单
点击File选中Bulid Setting。将两个界面拖到中间的大框中,在暂停哪个脚本中写上
UnityEngine.SceneManagement.SceneManager.LoadScene(0/1);括号里面是你的菜单界面的下标,注意返回菜单哪个按钮上需要有点击并执行这个函数的操作。具体可以上网百度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。