Unity3D开发之贪吃蛇制作

2020-06-30  本文已影响0人  qwer2626

首先因为只是一个小游戏,所以将游戏改为单屏就好。

点击File,选中Build Settings 选中默认得PC,下方有一个Player Settings,点击后,Inspactor面板中会出现Resolution选项,去掉Default Is Full Screen选中状态,自己修改合适屏幕大小。

找到Display Resolution Dialog,选为Disabled。

素材导入,可能是因为Unity3d自身的bug,所以素材导入可能会出现所有图片无颜色的情况,这个时候,可以在打开任意一个Unity3d项目,将当前无颜色的图片拖到那个项目中,图片颜色应该会出现,然后在拖回去即可。不过图片无颜色的情况不包括需要材质的情况。

背景制作,背景的方块自己可以用ps制作。只需要一个方块,将其制作成图案,然后填充整个背景即可。

标题的制作,创建UI界面之Text,设置相应坐标位置,大小,对其方式即可。

开始按钮制作。同理。

左侧的控制面板。说明一下,canvas画布可以和摄像机合并。选中canvas的RenderMode选项,将其改为Screen Space-Camera,然后将摄像机拖入到Render Camera中,就可以实现两者合并。

左侧的控制面板,主要用到了Text,Image,Taggle,Taggle Control,Shadow,outline几个属性,就是布局的操作,知道方法后不是很难

游戏开始界面。复制之前的游戏界面,删除游戏运行中不需要的UI,重新制作左侧的界面,不过现在是游戏进行中的相关信息显示。下方还有两个Image。一个返回开始界面,一个暂停游戏。

游戏碰撞处理,在游戏界面四周添加Box Collider碰撞器,具体添加方式是:制作两个空物体,一个空物体向上移到上边框外10px,一个移动到右边框外10px,设置与边框同样的大小属性。添加Box Collider属性。注意左边的边框的位置需要手动微调一下。

蛇的移动。基本上的UI界面都已经完善好了,现在就是要开始游戏的逻辑代码。

首先想一想,蛇在移动过程中需要些什么变量。方向、速度、每次移动距离。

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;

}

如此蛇的移动就完成了。

食物的产生,首先在canvas中做出一个40*40大小的图片,为其添加circle Collider 2D碰撞器,将其做成预制体。编写一个食物生成脚本。为了简洁,我们制作一个空物体,每一次生成的食物都放入这个空物体中,以便管理。

我们游戏界面的大小不是固定的,需要自己数清,我的是上下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().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);

}

碰撞器,在食物产生,并且蛇吃到食物时,需要做出相应的反应。首先蛇头需要添加Circle Collider 2D碰撞器,刚体组件。食物上需要加Box Collider2d。食物和蛇都需要添加标签。

在第一个脚本中添加代码

private void OnTriggerEnter2D(Collider2D collision)

{

//等价于 collision.gameObject.CompareTag(“food”); //标签名称是food

if(collision.tag == “food”){

Destroy(collision.gameObject); //销毁物体

FoodManager.Instance.CreateFo0d(); //创建食物

}

}

就可以了

蛇将食物吃下去以后,就应该需要生成一个蛇身,蛇身和之前的是食物一样,需要先将其预制体做出来,然后写一个函数,在碰撞器产生中执行这个函数来生成这个身体。

这需要一个list数组,每当生成一个蛇身都放入到这个数组中去,因为蛇需要移动,而每一节身体的移动,我们都是后一个身体到原本前一个身体的位置去,所以用数组可以很好的解决。当然也有简单的解决办法,但是这里的蛇身体时奇偶变化的,所以用不了。

蛇身体的两张图片需要相应的存储起来,每吃下一个食物,判断蛇身体个数的奇偶性,再去添加相应的身体图片。

public List bodyList = new List(); //存放蛇的身体

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().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);括号里面是你的菜单界面的下标,注意返回菜单哪个按钮上需要有点击并执行这个函数的操作

可以加我企鹅更多资料:112--6743--406

更多内容关注这里:http://www.makeru.com.cn/live/1390_1223.html?s=156461

上一篇下一篇

猜你喜欢

热点阅读