杂谈——根据第一个制作的小游戏学到的知识 (1)

遍历父本内的所有子物体的方法

foreach (Transform t in bgimage.gameObject.transform)//遍历后面的这个父物体里面的所有子物体
            {
                t.gameObject.GetComponent<Image>().enabled = false;//将父物体里面的所有子物体的image都禁用,即可以理解为不显示
            }

前后类型要一致,否则会出错,在这行代码中

t.gameObject.GetComponent<Image>().enabled = false;//将父物体里面的所有子物体的image都禁用,即可以理解为不显示

由于t所代表的是bgimage这个父本里面所有的子物体,所以这样写的意思是,将所有子物体里面的image全部禁用。
c#中一般的控件都有enable 这个属性 表示控件的可用性, 默认为true,表示可用, 当为false时,控件不可用,表现为灰色不可触发状态
对应的还有disabled 这个属性 跟他正好相反控件名.Enabled = true/false;

控件颜色的设置方法

第一种:Color

image.color = new Color(1, 1, 1, 1);

在这里面,接受的是一个 0-1 的值,需要用R、G、B、A各除以255.
第二种:Color32

image.color = new Color(255, 255, 255, 255);

同样这里接收的是 0-255 的值,也是R、G、B、A 的值

第三种:ColorUtility.TryParseHtmlString

public color tempcolor;
public Image bgimage;

ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempcolor);
bgimage.color = tempcolor

这是将十六进制的数,转换为color类型的变量
在三种方法中都需要去查一下对应的值。

使用代码控制unity中的文本显示的消息

public Text scoreText;
 public int score = 0;
 
void Update()
    {
        switch (score / 100)
        {
            case 0:
                break;
            case 1:
                break;
            case 2:
                break;
            case 3:
                msgText.text = "阶段" + 2;
                break;
            case 4:
                break;
            case 5:
                msgText.text = "阶段" + 3;
                break;
            default:
                msgText.text = "无尽模式";
                break;
        }
    }

在这里由于Update()函数是在uniyt中的每一帧都会被调用,所以当定义完分数增长的函数以后,若当前分数除100取整为下面所对应的情况时,就会自动的将显示的文字改变,注意,要在unity中将对应的控件挂上。

游戏的暂停与开始

方法一:

public bool isPause = false;

public void Pause()
    {
        isPause = !isPause;//相当于把此时的暂停取反 也就是不暂停
        if (isPause)
        {
            Time.timeScale = 0;//当时间增量等于0时,相当于时间冻结, 也就是暂停
            pauseimage.sprite = pauseSprite[1];//将此时的BUtton按钮的图片换成数组中的第一张图片
        }
        else
        {
            Time.timeScale = 1;//当时间增量等于1时,相当于恢复。
            pauseimage.sprite = pauseSprite[0];//将此时的Button按钮的图片换成数组中的第零张图片
        }
    }

关于Time.timeScale的理解,请看 https://blog.csdn.net/swj524152416/article/details/52931209
方法二:

IEnumerator GameOver(float t)  //传过来一个值,即停止多少秒之后运行
    {
        yield return new WaitForSeconds(t);//告诉系统等待多久多久之后,再做下一步
        UnityEngine.SceneManagement.SceneManager.LoadScene(0);//然后重新加载场景 也就是在unity中的场景1
    }

代码之场景转换

UnityEngine.SceneManagement.SceneManager.LoadScene(1);

这样做的前提是将要转换的场景提前设置好,如图在这里插入图片描述

唤醒(Awake())函数与开始(Start())函数

当脚本被加载时,会自动调用Awake()和Start()这2个函数
场景启动时,Awake函数总是在任何Start函数调用前调用(场景中的每个对象都调用一次)。但也有一些要点要记住:
·Awake只在预置物被实例化后才调用。
·如果一个游戏对象在程序启动期间是未激活的,则不会调用Awake,直到该对象被激活,或绑定在对象上的任意脚本的函数被调用。
·Awake是最先被调用的,即使脚本组件不启用,最好用于初始化脚本和资源配置。
start()只在脚本实例启用后第一帧刷新前被调用。
Start在Update第一帧调用前被调用,脚本必须为激活状态。
·Start在Awake之后,调用第一个Update之前被调用,且脚本必须为激活状态。
·这意味着你可以把脚本激活后要做的所有事都放在Start中实现。从而可以将一些初始化代码推后在必要时进行。

物体实例化

个人理解:实例化就是通过预制体来克隆物体

GameObject food = Instantiate(foodprefab);

food是实例化之后的对象
foodprefab 是想要实例化的物体,需要注意的是,在unity界面中,必须要把对应的预制体拖拽过去,否则会报没有实例化的物体等错误
对应如图
在这里插入图片描述
这里解释一下,在脚本中定义的不规范的变量的名字,在unity中会给规范起来,所以可能会有些不同

随机数

1:RandomRange(min,max);
有参min/max分别事最小范围与最大范围
2:Random.Range();
无参,编译器会自动根据系统时钟为种子这样只适用于精度需求比较低的项目
3.目前掌握这两个就够了,详细的在https://www.cnblogs.com/xiaowie/p/8759837.html了解

关于yield关键字的用法

1.首先yield的作用是,将当前集合中的元素立刻返回
2.返回元素用:yield return; 这是一个一个元素返回
3.结束返回用:yield break; 结束迭代,遇到这个关键字,不再迭代返回,已经返回多少就存在多少。
4.返回类型必须为 IEnumerable、IEnumerable、IEnumerator 或 IEnumerator。
这个IEnumerable是一个很有趣的东西,它是一个公开的枚举的枚举数,并且支持非泛型集合上的简单迭代同时也支持泛型集合上的迭代。

    public static void Print(IEnumerable own)
    {
        int i = 0;
        foreach (Object obj in own)
        {
            if (obj is Student)//这个是类型的判断,这里Student是一个类或结构
            {
                Student s=(Student)obj;
                Console.WriteLine("\t[{0}]:\t{1}", i++, s.Sname);
            }
            if (obj is int)
            {
                Console.WriteLine("INT:{0}",obj);
            }
        }
        Console.WriteLine();
    }

泛型的枚举

            List<string> fruits =
                new List<string> { "apple", "passionfruit", "banana", "mango", 
                    "orange", "blueberry", "grape", "strawberry" };
           // List<string> query = fruits.Where(fruit => fruit.Length < 6).ToList();
            IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
            foreach (string fruit in query)
                Console.WriteLine(fruit);

基本上,所有的数组类型的遍历,都源自IEnumerable。

在世界里,随机位置的设定

以二维举例,若想随机设定位置,自让少不了Random函数,除此之外还应该有位置函数,也就是vector3

		int x = Random.Range(-xlimit + xoffset, xlimit);
        int y = Random.Range(-ylimit, ylimit);
        food.transform.localPosition = new Vector3(x * 30, y * 30);

但是要注意,这个位置其实是个点,在unity中点和向量都是由Vector3表示的,如图是vector3的定义。在这里插入图片描述
可以看出,他有三个坐标,分别是x、y、z,代表了在世界中的位置。

单位向量

		Vector3 poin = new Vector3(4, 5, 5);
        Vector3 P;
        P = Vector3.Normalize(poin);
        Debug.Log("v" + poin);
        poin.Normalize();
        Debug.Log("v" + poin);

Vector3.Normalize(对象), 是将vector3的对象单位化之后付给别的对象或者变量,本身并不发生变化,对象.Normalize(),则是将本身单位化,所以输出的结果为
在这里插入图片描述

Vector3.lerp线性插值的简单理解

插值是数学上的一个概念,在这里用公式表示就是:from + (to - from) * t;这也就是Lerp的返回值
Vector3.lerp(Vector3 from, Vector3 to, float t)
其中from是起点,to是终点,t是所占百分比,比如当t = 0.1时,所代表的意思就是启动之后的每一帧,都会由起点向终点移动百分之十,这是个由快到慢的过程
在这里插入图片描述
也就是图中的从from到to由快到慢移动的过程,这f可以应用到相机跟随移动的物体方面

实现相机跟随物体运动

using UnityEngine;
using System.Collections;

public class CameraFollow : MonoBehaviour {

    public Transform target;    //camera的跟随目标
    public float smooth = 0.5f; //平滑量
    Vector3 distance;

    void Start()
    {
        distance = transform.position - target.position; //target到camera的距离
    }

    void Update()
    {
        transform.position = Vector3.Lerp(transform.position, target.position + distance, smooth);

    }
}

持续调用与撤销

持续调用的函数:InvokeRepeating(“Move”, 0, velocity);

Move:是指需要持续调用的函数名字;
0:是指场景开始多久之后调用;
velocityity:是指每隔多久调用一次
用处:可以用作角色的加速运动,场景的快进快退等
如小游戏中蛇头的加速移动,部分代码如下

 void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CancelInvoke();//取消那个循环调用的方法  也就是invokerepeating 这个函数方法
            InvokeRepeating("Move", 0, velocity-0.2f);//这是一个持续调用的函数 第一个参数是 调用的方法名,第二个参数是指多久开始调用, 第三个是每个多长时间调用一次
        }

        if (Input.GetKey(KeyCode.W) )//获得用户输入的键盘类型  如果是w的话 往上走  并且蛇没有向下走
        {
            gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);//当时所在位置的旋转 四元数里面有旋转的方法 euler
            x = 0;
            y = step;
        }
        ...
        ...
        ...
     }

代码之中的Step定义如下

public int step;//记录蛇每次走多少好

重点在于,需要在unity内部将step的值设好,如图。
在这里插入图片描述
至于撤销持续调用的函数很简单:CancelInvoke();

给游戏场景添加声音

第一步:定义变量

	public AudioClip eatclip;
    public AudioClip dieclip;

一个是吃东西的声音,一个是死亡的声音
第二步:设定发音场景

void Die()
    {
        AudioSource.PlayClipAtPoint(dieclip, Vector3.zero);
    }
void Grow()
    {
        AudioSource.PlayClipAtPoint(eatclip,Vector3.zero);
       
    }

这里面设定的场景是Die(),和Grow()场景
声音发出的方法是

AudioSource.PlayClipAtPoint(eatclip,Vector3.zero);

其中eatclip是保存声音的变量,Vector3.zero是发音的位置,这个zero表示的是在(0,0,0)发音
第三步:在unity内部添加 Audio Source 组件,提醒一般主声音添加到摄像头上,特殊声音,如升级,死亡,拾取等声音添加到游戏物体上,如图
在这里插入图片描述
在这里插入图片描述
其中这个BGM是游戏的背景音乐,Eat与Die分别是吃食物与死亡的声音。

对于PlayerPrefs.GetString(“sh”, “sh01”)与 PlayerPrefs.SetString(“sh”, “sh02”)的简单理解

PlayerPrefs.GetString(“sh”, “sh01”)先检查Unity中的prefabs文件夹,看看里面的sh是不是已经有值,若有值咋返回这个值,否则返回后面sh01所对应的值
PlayerPrefs.SetString(“sh”, “sh02”) 将sh02对应的值覆盖到sh中

Toggle控件的操作

首先设置toggle控件的变量

	public Toggle blue;//它有ison这个组件,当ison为true时,对应toggle中的ison会被勾选上,也就是当前选择的是他,下面的几个属性同理
    public Toggle yellow;
    public Toggle border;
    public Toggle noBorder;

在这三个对象里面有ison组件,当其为true时,会被勾选上,反之则不会被勾选上

        if (PlayerPrefs.GetString("sh", "sh01") == "sh01")//先读取playerPrefs中保存的 sh 如果有,则返回sh 如果不是则返回后面的那个字符串所代表的东西,并判断 如果sh01 则进行if下面的语句操作
        {
            blue.isOn = true;
            PlayerPrefs.SetString("sh", "sh01");//将后面的字符串里面的内容设覆盖到前面,下面同理,相当于把蓝色的蛇头给sh
            PlayerPrefs.SetString("sb01", "sb0101");
            PlayerPrefs.SetString("sb02", "sb0102");
        }

其中勾选组件的代码时blue.ison = true;
当然还要有最后一步,在unity中把对应的拖拽过去,如图在这里插入图片描述
需要注意的是其中的skin所添加的组件是 Toggle Group 而它的子物体里添加的是Toggle,如图在这里插入图片描述
在这里插入图片描述
另外不要忘了添加上对应的动态布尔组件,
动态布尔值:
调用这个玩意之后会将动态布尔值到底是什么传到这个函数方法里面,是取消还是调用
若没有这个值,你不知道到底是什么值,还得额外写东西取获取这个值,
如图,是选择对应的函数(控制布尔值的函数)在这里插入图片描述
第一个小游戏学到的知识大致是这些,基本上涉及到的知识都查了,也都大致明白怎么用,没有去理解原理,是因为觉得还没到那种地步,希望大佬们多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值