20270人加入学习
(121人评价)
Unity初级案例 - 贪吃蛇(Unity2017.2.0)

制作于2017.12.16

价格 免费

蛇头需要的功能

  移动:自身移动、控制蛇身移动

  吃:增加蛇身,销毁食物

 

每个时间单位,蛇头向前移动一个单位

 

蛇身需要的功能

 移动:·每一节蛇身移动到它前面蛇身的位置

            ·蛇屁股移动到

[展开全文]
  • CancelInvoke可用于停止InvokeRepeating以修改一些参数
[展开全文]

1.这是一个纯UGUI游戏,所以蛇头会用UGUI来做

 

2.创建一个Image作为蛇头,做成Prefab

 

3.创建一个脚本SnackHead

注意:脚本名如果写错,删掉重建,否则既要改脚本名,又要改脚本内类名

 

4.删掉所有函数

  代码如下


  public float velocity;
  public int step;//蛇一格走多少
  private int x,y;//蛇头下一次的移动向量
  private Vector3 headPos;//蛇头的位置

  void Move{
      //把蛇头移动一个向量
      headPos =  gameObject.transform.localPosition
      gameObject.transform.localPosition = new Vector(headPos.x+x,head.y+y,headPos.z);

      } 
  void Update()
  {
    if(Input.GetKey(KeyCode.W)) 
       {x=0;y=step;}
    if(Input.GetKey(KeyCode.S))
       {x=0;y=-step;}
    if(Input.GetKey(KeyCode.A))
       {y=0;x=-step;}
    if(Input.GetKey(KeyCode.D))
       {y=0;x=step;}


}
  void start
  { 
     invokeRepeading("move",0,velocity);//每隔一段时间执行这个函数
     x=step;y=0;
  } 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

[展开全文]

1.完善蛇头方向朝向代码实现:

  gameObject.transform.localRotation = Quternion.Euler(0,0,90);

//保存Rotation的数据结构是一个四元数,所以想赋值需要把三维向量转换为四元数,用Quternion.Euler即可

//改变z轴,z轴朝内,故逆时针转

 

2.逆转头问题:

每次转头判断是否是逆转头

代码:if (Input.GetKey (KeyCode.W) && y != -Step) 

 

3.蛇头的加速

按下时加速:

抬起时回复:

        if (Input.GetKeyDown (KeyCode.Space))
        {
            CancelInvoke ();

//取消
            InvokeRepeating ("Move", 0, velocity-0.2f);
        }

        if (Input.GetKeyUp (KeyCode.Space))
        {
            CancelInvoke ();
            InvokeRepeating ("Move", 0, velocity);
        }

[展开全文]

1.没有出现Apply的设置都会自动保存;

[展开全文]

1.outline会描边,shadow会增加阴影;

[展开全文]

[任务16:13-处理蛇身的移动之方法一]

导入Last

直接在代码最开头加上

using System.Linq;

 

[展开全文]
  • 2D碰撞器相交也会触发OnTriggerEnter() 此时需要将碰撞器面积设置得稍小一些。
[展开全文]

其实 GetKeyDown 比 GetKey 更符合逻辑,因为转向是一次性的,玩家不可能通过持续按一个键来完成连续转向。

[展开全文]

蛇头 承担大部分功能:

move 分为蛇头自己的移动和蛇身的移动

eat 吃食物 1.加一个蛇身 2.销毁食物

碰撞边界死亡

无边界传送

蛇身 承担与蛇头碰撞检测功能

加一个collider做检测

 

蛇头移动以突变(Transform)进行而不是插值(Lerp)变化或者(MoveToward)移动

用InvokeRepeating进行

 

蛇身有两种方法移动

1.让所有蛇身向“前”加1。实现起来较为困难。

方法:让每一个蛇身继承前一个位置,从后往前继承。

2.把最后一个蛇身移到蛇头后第一个节点。

 

由于双色蛇身,方法2会导致蛇身换色,吃食物加蛇身会颜色混乱。

 

 

吃东西

吃后加蛇头后第一个节点导致颜色混乱,所以加蛇尾节点

 

死亡

蛇头碰撞边界Collider检测

 

传送

蛇头Transform 变负值即可

[展开全文]

我用和你一样做的方法,但是我的触发检测不检测

 

[展开全文]

1:移动方式,继承上一个位置,最后一个移动到第一个(改颜色)

2:吃东西,加到最后一个位置,看颜色

3;gu

[展开全文]

暂停游戏与返回菜单的开发

变量 bool记录状态  持有暂停按钮 暂停图片组图片组

public Button pauseButton;

public Sprite[] pauseSprites;

private bool isPause = false;

方法 暂停的方法 自己的UI Button被按下

       先取反   !

换里面的Image图片  上面错了 改成Image类型

给暂停按钮绑定监听事件  再在原脚本里拖赋值

控制冲突 Input

修改移动方法的bug

主页按钮的返回功能

 

[展开全文]

 

 

 

 

1.食物注意:生成的位置需要让蛇能够吃到,所以以蛇头的长宽做网格,生成在有效的网格内

 食物需要生成在 下-6*30,上6*30,左7*30,右11*30

 

 

2.制作食物的prefab,Image,设置合适大小

 

3.创建归类用的空物体,FoodHolder

注意:在UI中,如果创建一个归类用的空物体,那么最好将大小锚点设置到父物体四个角上

 

3.添加脚本FoodMaker

//上下左右食物生成坐标的限制

public int xRightLimit = 11;

public int yLimit = 6;

public int xLeftLimit = 7;

public GameObject food;

//图片数组,Sprite用来存储图片

public Sprite[] foodSprites;

 

private Transform foodHolder;

 

void Start()

{

  foodHolder = GameObject.Find("FoodHolder").transform;

MakeFood();

}

 

//生成条件:开始生成一个,被吃掉生成一个

void MakeFood()

{

    int index = Random.Range(0,foodSprites.Length);  

 

 

//将食物实例化出来(面板拖出来) 

    GameObject food = Instantiate(foodPrefab);

 

//

food.GetComponent<Image>().sprite = foodSprites[Index];

 

 

//食物归类到父物体,且不调整food的transform

   food.transform.setParent(foodHolder,false)

 

 

//随机位置

int x=Ramdom.Range(-xLeftLimit,xRightLimit );

int y = Ramdom.Range(-yLimit,yLimit);

food.transform.localPosition = new Vector(x*30,y*30,0);

 

 

}

 

4.创建一个空物体,专门用来挂脚本,然后将FoodPrefab赋值,foodSprites全选图片拖住赋值

 

 

 

 

 

 

 

 

 

 

[展开全文]

ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempColor);

颜色实用工具:尝试去解析一个16进制的值,

第一个是一个16进制的颜色值,out 参数

[展开全文]

死亡方法与特效

放在蛇头里

方法Die CancelInvoke

变量 状态 bool 拿爆炸特效GameObject  拖一下特效

特效播放就是实例化

协程(也叫接口?)来控制等一会重载场景(控制特效)

命名空间

IEnumerator(这是返回值) GameOver(float  t)

yield return new WaitForSeconds(t);(看到这句话就会等待一下再执行下面的代码  括号内得是参数

死亡后记录得分

unity自带类

PalyerPrefs.SetInt("last1", MainUIController.Instance.length) ; 要记录的都是整数(名字加东西)

最佳的分判断 结构与上面记录一样 以0开始 判断后记录  记录后下次直接返回的就是这个值

 

这里就更加体现在记录数据系统中单例的重要性

[展开全文]

对用户设置的储存

给start脚本写一个脚本UI

变量 两个文本组件持有

方法

Awake 里拿一下得分PlayerPrefs

回到开始场景回到游戏里用空物体先reset一下tranform挂上脚本 然后托好物体

再做一下start(GO)的按钮

方法用public 在帮一下监听事件 两个按钮的

这里一个ScriptHolder 控制两个场景 确实妙

才发现之前换行符写成除号了

皮肤与模式的设置(toggle)

方法  四个方法  注意特殊的bool isOn 动态bool(只有false转到true才会调用)

拖好方法

先把皮肤蛇头蛇身文件名储存下来PlayerPrefs(后面的是文件名)

border 用SetInt  没有setBool这个选项

上次设置的读取

start方法里一开始是蓝色的蛇  读取sh 默认sh01判断是否是蓝蛇

打勾 blue.isOn = true

其他一样的思路

变量还要把4个toggle 拿进来

[展开全文]