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

制作于2017.12.16

价格 免费

碰撞器要小一圈

两个物体必须都要有2D碰撞器(注意碰撞器是否一样)

碰撞器的判断要放在蛇头的身上

 

[展开全文]

加载场景

  • UnityEngine.SceneManagement.SceneManager.LoadScene(0);
[展开全文]

 ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempColor);修改BG颜色

[展开全文]

 localPosition是根据父节点为中心,如果没有父节点,localpositon和position是没有区别的

[展开全文]

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

导入Last

直接在代码最开头加上

using System.Linq;

 

[展开全文]

[任务13:10-第一个食物的随机生成]

导入(老师是说加上)UnityEngine.UI

要在最开头

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

加上using UnityEngine.UI;

就是这样

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

下面附上本节课的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class FoodMaker : MonoBehaviour {
    public int xlimit = 20;
    public int ylimit = 11;
    public int xoffset = 8;
    public GameObject foodPrefab;
    public Sprite[] foodSprites;
    private Transform foodHolder;

    private 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.SetParent(foodHolder, false);
        int x = Random.Range(-xlimit + xoffset, xlimit);
        int y = Random.Range(-ylimit , ylimit);
        food.transform.localPosition = new Vector3(x * 30, y * 30, 0);

    }

}
 

[展开全文]

难点是如何让蛇在吃到食物时销毁食物,同时在蛇尾末端长出一个新身体单位。

 

以及如何编写蛇头读取键盘指令移动的代码,以及如何让每一个蛇身单位继承前一个单位的位置。

[展开全文]

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

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

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

[展开全文]

游戏逻辑实现概述

1.SnakeHead:实现基本所有逻辑

(1)Move:蛇头移动和蛇身移动

操纵蛇头的Transfrom每隔一段时间移动一定距离

然后蛇头发指令,让所有的蛇身移动到它前面蛇身的位置

第二种实现方法:将最后一个蛇身移动到第一个蛇身位置,但是这种适合蛇身是单色的模式

(2)Eat:吃到食物蛇身加一,食物自己销毁

 

 

2.SnakeBody:挂在Collider组件检测碰撞

 

3.无尽模式下传送的制作

 

[展开全文]

1.在file的buildsetting里面的playersetting里面的resolution and presentation里面的fullscreemMode可以调是什么分辨率或者是不是全屏
2.Display Resolution Dialog可以调是否弹出游戏双击以后的那个调分辨率的白色框框
3.Canvas里面的UI可以用stretch设置锚点,默认是锚点对齐Canvas物体不动,按住Alt键变成锚点对齐Canvas物体跟随吸附
4.Image组件里面的Color有RGBA四种可选,其中A可以调节Image的透明度
5.锚点,就是在Canvas中四个方向的锚点对应矩形的四个顶点,在变换时,锚点与其对应顶点的距离始终不变
6.图片SetNativeSize,就是让图片的像素完美化,适应化
7.组件outline,可以给图片加一个边框
8.组件Shadow,可以给图片加一个阴影效果
9.在Transform组件中的数值设置格子可以直接输入算式,比如-100+25+10,会直接得出结果
10.在Canvas中,Canvas子对象的绘画顺序遵循在面板中的上下顺序,也就是谁在上面谁先画
11.选中名字之后按F2可以直接重命名
12.在Canvas坐标系下的移动要用localPosition进行本地移动,如果用Position的话就会变成在世界坐标系上移动
13.Invoke延时多少秒后执行方法,InvokeRepeating延时多少秒后执行方法并在多少秒后重复执行
14.gameObject.transform.SetParent(gameObject.transform, true or false);    第一个参数是父物体的transform第二个参数是是否转换成世界坐标
15.在UI的Canvas坐标系下,gameObject.transform其实是该对象的RectTransform,所以当不是使用gameObject.transform的时候用于
    记录的应该是RectTransform(存在疑问)
16.在public数组下,可以全选拖拽添加不限长度,或者在代码中优先取一个可更改的长度
17.在使用List的时候有一个Last方法可以直接获取表尾元素,但是要using System.Linq
18.ColorUtility.TryParseHtmlString("16进制颜色", out Color color) 该方法是解析一个16进制的颜色数传送到后面的color类型的值中
19.Time.timeScale是游戏时间缩放项,通过设置timeScale的倍数可以调节游戏的时间进行程度,调成0可以暂停游戏1就是一倍速,以此类推
20.画面焦点,就是在游戏进行中,如果你的鼠标点到过某些按钮,你会发现你可以用空格或者回车同样可以调节那个按钮,这是我们不希望看到的
    那么,我们应该在Edit里面的ProjectSetting里面的Input里面找到会相应空格和Enter的按键,把他删掉就可以屏蔽焦点按钮的空格或者Enter响应
    具体到底是什么设置还不是很懂,请百度
21.协程。需要using System.Collections;。它是一种创建伪线程的方法,即可以模拟多线程,在一帧内做更多的事,同时也可以作为某些物体的逐渐消失
    且不用写到Update里面。协程其实是一种特殊的函数返回类型,这种返回类型的函数中可以使用yeild return 关键字实现各种各样的逐帧操作。
    yield return表:
    yield return null; // 下一帧再执行后续代码
    yield return 0; //下一帧再执行后续代码
    yield return 6;//(任意数字) 下一帧再执行后续代码
    yield break; //直接结束该协程的后续操作
    yield return asyncOperation;//等异步操作结束后再执行后续代码
    yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
    yield return WWW();//等待WWW操作完成后再执行后续代码
    yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
    yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响)
    yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响)
    yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
    yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
    yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
    调用协程的方法有两种,分别是StartCoroutine(/这里直接调用方法,添加参数/),另一种是StartCoroutine(/这里填写”字符串的方法名字”,方法参数/)。
    第一种方法的优势在于可以调用多个参数的方法,后一种方法只能调用不含参数或只包含一个参数的协程方法。
    但是第一种方法不能通过StopCoroutine(/这里填写”字符串的方法名”/)来结束协程,只能通过StopAllCoroutines来结束。
    后一种则可以通过StopCoroutine来结束对正在执行的协程的调用。
22.简单存储方法,PlayerPrefs类,可以调用三种类型的简单存储int,float和string。检索方法是字符串匹配参数一是名字字符串,参数二是值
    该类的存储方式是注册表,键值对,具体的PlayerPrefs类方法请百度,这里不写了
23.Resources动态加载。首先在Assets文件下的任何一个地方创建一个叫Resources的文件夹,Unity提供了相应的类去访问加载该文件夹下的数据
    具体Resources方法请百度,这里不写了
24.foreach循环的unity用法。foreach循环如果循环transform的话可以循环指定父物体的子物体。
25.某个组件的enabled可以设置该组件是否起作用,true起作用,false禁用

//单词
ControlPanel    控制面板
Reward         奖励

//小技巧
1.当使用public数组拖拽的时候,把初始对象置空,可以方便debug。比如sprite组,一开始的对象sprite就是空的不放东西
2.C#快速添加属性Ctrl+R+E

[展开全文]

list集合

bodylist.last(),需要引入新的命名空间

bodylist.insert

bodylist.Add

bodylist.RemoveAt

bodylist.count

[展开全文]