碰撞器要小一圈
两个物体必须都要有2D碰撞器(注意碰撞器是否一样)
碰撞器的判断要放在蛇头的身上
主要考虑蛇头,蛇身跟蛇头
加载换皮肤
单选框的使用
储存数值
PlayerPrefs.GetInt()
加载场景
ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempColor);修改BG颜色
InvokeRepeating()重复调用方法
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);
}
}
quaternion.euler 四元数旋转
08:00
难点是如何让蛇在吃到食物时销毁食物,同时在蛇尾末端长出一个新身体单位。
以及如何编写蛇头读取键盘指令移动的代码,以及如何让每一个蛇身单位继承前一个单位的位置。
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