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

制作于2017.12.16

价格 免费

Unity中Invoke 和 InvokeRepeating的区别

Invoke() 方法是 Unity3D 的一种委托机制

如: Invoke("Test", 5);   它的意思是:5 秒之后调用 Test() 方法;

使用 Invoke() 方法需要注意 3点:

1 :它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;

2:Invoke(); 不能接受含有参数的方法;

3:在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用到

Invoke() 也支持重复调用:InvokeRepeating("Test", 2 , 3); 

这个方法的意思是指:2 秒后调用 Test() 方法,并且之后每隔 3 秒调用一次 Test() 方法

还有两个重要的方法:

  1. IsInvoking:用来判断某方法是否被延时,即将执行
  2. CancelInvoke:取消该脚本上的所有延时方法

 

[展开全文]

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

[展开全文]

注意,UGUI的渲染顺序是层级面板的前后顺序,所以应该注意大面板与控制面板与文字的先后关系

 

1.为界面添加食物图片,添加Image,源图片添加食物图片,重复以上操作,添加所有食物图片

 

2.设计控制面板:

       技巧:先设计第一个,规范第一个大小,字体,样式后直接复制

                 锚点大小快捷设置可以将图片快捷填充到父对象大小

                 对多个游戏对象的同一属性赋同样的值,可以全选中在赋

 

 

     ·在控制面板下创建三个Text,分别为

------------------------

          “皮肤”:锚点四点控制面板上边中

             皮肤下创建一个toggle,改名Blue,锚点上边中,背景锚点大小全铺,对勾锚点左上角,位置左上,字体为“科技小蛇”

             在背景下创建几个Image,源文件拖入几个蛇的元素,组成一条蛇,舌头教徒转90

 

            复制粘贴Blue,创建另一条“小黄人蛇”

            设置单选框组

 

-------------------------

          “模式”:锚点四点控制面板左线中

             在模式下创建一个UI-Toggle单选框

             Label改变:Text“边界模式”,设置字体,字体颜色,为单选框的Label添加OutLine组件

              BackGround改变:改变大小,改到合适,锚点左边中,改变颜色透明度

              CheckMark摁住alt,在锚点大小快捷设置里alt摁最后一个,勾勾会填充到父对象大小

              复制边界模式,改名自由模式

              由于自由模式与边界模式的单选框是互斥的,在模式父对象下加一个组件ToggleGroup,表示两个单选框为一组

              将父对象Mode拖入 自由模式与边界模式的Toggle组件下的Group属性表示其为一组

              找到边界模式,将Toggle组件下InOn(取消激活)的钩去了

 

----------------------------------------

          “历史”:锚点四点控制面板下边中

                   在历史下设置两个子对象Text:

                   “上次:长度0,分数0”、

                   “最好,长度0,分数0”

                    锚点上边中

 

 

            (锚点快捷设置都是以父对象为基准)

 

 

 

[展开全文]

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

public class SnakeHead_text : MonoBehaviour
{
    public float Velocity = 0.35f;
    public int steep;
    private int x;
    private int y;
    private Vector3 headPos;
    private void Start()
    {
        InvokeRepeating("Move", 0, Velocity);//重复调用,按照“Velocity”频率,在0秒后立即调用;
        x = steep;y = 0;//在开始时就向右移动
    }
    private void Update()
    {
        if (Input .GetKey (KeyCode.W ))
        {
            x = 0;y = steep;
        }
        if (Input.GetKey(KeyCode.S ))
        {
            x = 0; y = -steep;
        }
        if (Input.GetKey(KeyCode.A ))
        {
            x = -steep ; y = 0;
        }
        if (Input.GetKey(KeyCode.D ))
        {
            x = steep ; y = 0;
        }
    }
    void Move()
    {
        headPos = gameObject.transform.localPosition;
        gameObject.transform.localPosition = new Vector3(headPos.x + x, headPos.y + y, headPos.z);
    }
}
 

[展开全文]

Sh里,加Box collider 2D,Width:45 Height:45 Size X: 28  Y:28,选中Is Trigger,,加Rigidbody 2D,且不启用重力。

Food里,加Box collider 2D,Width:40 Height:40 Size X: 28  Y:28,选中Tags,输入food标签

{

public float velocity=0.35f;

public int step;

private int x;

private int y;

private Vector3 headPos;

void Start()

{

  InvokeRepeating("Move",0,velocity);

x=0;y=step;

}

void Update()

{

 if(Input.GetKeyDown(KeyCode.Space))

{

CancelInvoke();

InvokeRepeating("Move",0,velocity-0.2f);

}

 if(Input.GetKeyUp(KeyCode.Space))

{

CancelInvoke();

InvokeRepeating("Move",0,velocity);

}

if(Input.GetKey(KeyCode.W)&&y!=-step)

{ gameObject.transform.localRotation=Quaternion.Euler(0,0,0);

 x=0;y=step;

 }

if(Input.GetKey(KeyCode.S)&&y!=step)

{

gameObject.tranform.localRotation=Quaternion.Euler(0,0,180);

 x=0;y=-step;

 }

if(Input.GetKey(KeyCode.A)&&x!=step)

{

gameObject.tranform.localRotation=Quaternion.Euler(0,0,90);

 x=-step;y=0;

 }

if(Input.GetKey(KeyCode.D)&&x!=-step)

{

gameObject.tranform.localRotation=Quaternion.Euler(0,0,-90);

 x=step;y=0;

 }

 

 void Move() 

 {

headPos=gameObject.transform.localPosition

gameObject.transform.localPosition=new Vector3(headPos.x+x,headPos.y+y)

}

private void OnTriggerEnter2D(Collider2D collision)

{

  if(collision.gameObject.CompareTag("Food"))

  {

  Destroy(collision.gameObject);

  FoodMaker.Instance.MakeFood();

}

}

[展开全文]

单例模式

例如:

private static MainUIController _instance;


 public static MainUIController Instance{
        get 
        { 
            return _instance;
        }
    }

//为了从SnakeHead脚本获得通知,就要定义一个static变量,就可以从类名访问,而不用获取到对象

//之后定义一个public方法就可以访问进来,从而可以把这个私有的_instance赋值给它
    

[展开全文]

场景。。。。。Scene

锚点。

借鉴开发思路。。

 

[展开全文]

collider2d 边界。

锚点做好

相当于空气墙。

加一个红色,xian'shi

[展开全文]

逻辑思路。。

如何去完成。。

所有移动对蛇头而言,

sb

蛇头move,每个一段时间突变,直接操控transform,改变一个值,

InvokeRepeating();

后面每一个蛇身移动到前一个位置。

最后一个蛇尾移动到蛇脖子处。

 

吃食物。往后加节点。

传送。传蛇头就可以了。蛇身复刻。

蛇头管理蛇身,

吃食物,蛇身变长,

 

[展开全文]

setNativesize. 添加到image后,调整为自身合适的大小。

全部yonglocationPosition,本地位置。

invokeRepeating.   

[展开全文]

在Canvas上建一个Image,重命名SnakeBody,把sb0201导入,Width:40 Height:40,Pos X:0 Pos Y:0,将SnakeBody作为预制体,删掉蛇身

[展开全文]

Qaternion.euler();

全部使用localPosition.

不能立马回头。

控制一个物体自身的旋转最好不要用世界坐标。

自身的localppostion..

还需要先取消invokeReapeating..

 

 

[展开全文]

食物随机生成。

上下11.左14.右21.

 

 

SetParent.false.

 

[展开全文]

在Canvas里建一个Image,重命名Reward,把文件Tool中的Question拖入场景,Width:30 Height:30  加Box Collider2D,Size X:28 Y:28 将Reward拖到Prefabs.

把Reward拖到ScriptsHolder中的Reward Prefab中

[展开全文]

在Scripts建一个脚本,重命名MainUIController,

代码如下:

public class

[展开全文]

处理食物被吃掉并再生成。。

碰撞器更小一点。

辨别,加标签。

碰撞检测。

埋头干就完事了。

[展开全文]

授课教师

SiKi学院讲师

课程特色

图文(1)
视频(23)
下载资料(1)