Unity3d贪吃蛇

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

点击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<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);

}

 

 

  • 碰撞器,在食物产生,并且蛇吃到食物时,需要做出相应的反应。首先蛇头需要添加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<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);括号里面是你的菜单界面的下标,注意返回菜单哪个按钮上需要有点击并执行这个函数的操作。具体可以上网百度。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unity贪吃蛇游戏源码+AI-游戏源码: 1.利用ngui插件对界面进行了仿写 在仿写界面途中发现,贪吃蛇这个游戏在界面适应屏幕分辨率,所以在开发中需要注意界面对屏幕的适应性。通过每个图片的宽高 和uiroot的比值,在start方法中对他进行了缩放。 2.利用 ngui 自带的uidragdropItem实现摇杆 界面完成之后,首先对贪吃蛇的摇杆进行了编程。 在unity中的NGUI上,给sprite创建添加一个uidragdropitem 实现了sprite的拖动。 AI的开始,移动逻辑: 整体只考虑三个前景: 1.首先先判断蛇首的简介范围是否有其他蛇死亡了留下的食物,如果有的话设置当前朝向为星星方向,便设置移动倍率为2,否则判断第三种情况; 3.随机朝某个位置移动。如果每帧AI都在更新的话,蛇的反映速度依然会更快,需要设置一下AI的更新间隔,通过调整这个间隔和蛇首的简介方位来调整AI的反映速度,目的是能够让玩家有机会撞死AI。 AI 移动的方向分析: AI在一个平面上运动,坐标就只有两个<x,y> 把他用0和1表示为: ----- 4个方向 上下左右 (0,0) (0,1) (0,-1) (-1,0) (1,0) 四个角度 象限。 (-1,1) (1,1) (-1,-1) (1,-1) 设计思路就是把AI蛇也当作是用摇杆来控制的。那么AI就方便写多了,只是 在还没开始写之前,要考虑的就是AI蛇多了之后程序会不会卡死了。在使用线程控制的过程中发现了一个问题,cup利用率太高。所以想先尝试一下在update上操作。如果不行的在想其他的办法。 设计: 把每个AI蛇都相当于人在控制他。那么想象一下虚拟摇杆,用一个数组来存这些虚拟摇杆的位移坐标 把每条AI蛇的长度也记录下来,默认长度就20 错误: NullReferenceException: Object reference not set to an instance of an object AI6control.flootAIOneBody6 (Vector3 V) (at Assets/AI6control.cs:57) AI6control.AIsix () (at Assets/AI6control.cs:40) AI6control.Update () (at Assets/AI6control.cs:13) 该错误在百度上说:没有实例化的问题 最后一个下午的代码调试 发现由于自己的粗心 导致了把<符号写成了<=符号 就因为这个问题,让贪吃蛇变成了 卡神,害我看了好几天,现在解决了,贪吃蛇也变流畅了好多. Ai蛇也需要吃食物。长大,在游戏刚启动的时候就让Ai蛇在地图中吃食物,成长,当用户进入游戏的时候AI蛇已经吃到了一定的食物。测试了AI蛇确实发现他能吃食物。死后的处理也处理了。 在AI蛇吃食物的时候 ,地图中食物太多,控件太多。没法知道他是什么时候,查了资料说是要遍历地图中的对象,测试了一下,发现对象太多,程序卡得不要不要的,只能用触发器,避免遍历食物让程序运行不流畅或者变得死机等情况。 这样的话 在游戏中运行10-20条蛇是没有问题的。 地图中有10个点,这10个点是用来AI蛇死后复活的地方。 增加了限定时间模式. 经过很多的测试,也发现了很多的bug 不过都基本改完了,现在暂时没有发现bug

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值