siki学院 unity,siki unity a计划

说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天。本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不作为教程使用,仅用于自己学习参考,记录于此,聊表心意。

★★游戏流程管理

首先建立一个空物体,挂载管理类,设置为单例模式:

   public static GameManager _instance;
    void Awake) {
        _instance = this;
    }

在管理类中写小鸟初始化函数,先建立小鸟和小猪的列表,然后写初始化函数:

    public List<Birds> birds;
    public List<Pig> pigs;
    //初始化函数,对于小鸟的列表,每排在第一个的小鸟激活,其他的不激活
    private void Initialized) {
        for int i = 0;i < birds.Count;i++) {
            if i == 0)
            {
                birds[i].enabled = true;
                birds[i].sp.enabled = true;
            }
            else {
                birds[i].enabled = false;
                birds[i].sp.enabled = false;
            }
        }
    }

然后写流程控制函数,该函数在小鸟销毁时调用(定义为公共),以便于下一个小鸟的初始化。

    public void NextBird){
        if pigs.Count > 0)
        {//还有猪
            if birds.Count > 0)
            {//还有鸟,初始化鸟
                Initialized);
            }
            else
            {//没有鸟,输了
            }
        }
        else
        {//没有猪,赢了
        }
    }

在小鸟的代码中写小鸟销毁函数,主要处理从管理类的列表移除当前小鸟,销毁当前鸟,生成小鸟销毁特效,调用流程控制(判断游戏流程)。(注意需要为小鸟也添加销毁特效不再赘述)

    void DestoryBird) {
        GameManager._instance.birds.Removethis);
        DestroygameObject);
        Instantiateboom,transform.position,Quaternion.identity);
        GameManager._instance.NextBird);
    }
另外,在鼠标抬起的小鸟飞出的代码后面,加上调用小鸟销毁函数,在5秒后执行。
    Invoke”DestoryBird”, 5f);
另外,在start函数中初始化小鸟状态:
    void Start ) {
        GameManager._instance.NextBird);
    }

注意,在小鸟代码中需要将SpringJoint2D属性设置为public,以至在Initialized初始化函数中能够对其进行激活设置。(可设置在面板隐藏)如下:

    [HideInInspector]
    public  SpringJoint2D sp;

★★小鸟生成位置优化,皮筋优化

位置优化,主要在小鸟初始化时,将其第一个小鸟位置设置为在场景中得到的第一个小鸟的位置。

    birds[i].transform.position = originPos;

这里的初始位置,在Awake中得到。
先声明初始位置    public Vector3 originPos;

        if birds.Count > 0) {
            originPos = birds[0].transform.position;
        }

皮筋优化,在鼠标抬起时,禁用画线组件,鼠标按下时激活画线组件即可。
鼠标抬起:
        rightLine.enabled = false;
        leftLine.enabled = false;
鼠标按下:
        rightLine.enabled = true;
        leftLine.enabled = true;

★★小鸟拖尾效果(使用武器拖尾插件)

关于Pocket RPG Weapon Trails插件的使用在此不再说明,详细使用方法参考其他博客文章,因个人觉得这个拖尾效果不适合小鸟,故本次制作中也不再制作拖尾效果。

★★场景优化(搭建)

在目前的制作中,小鸟的数量是直接拖到游戏场景中,小猪的数量也是直接拖到游戏场景中,此两样暂时没有种类变化。

木头石头冰棍等其他障碍物,挂载的是小猪的代码,在场景中加入障碍物图集后,添加刚体和碰撞体,挂载小猪代码,不勾选是小猪,有如下参数需要具体说明:
【死亡速度】,【受伤速度】,【受伤图集】,【爆炸特效预制体】,【分数特效预制体】,其中还有其他的参数需要调整,及刚体组件的【质量】和【角阻力】,

可以将长木头,三角木头,石头,木头框,等不同类型的障碍物分别制作成不同的预制体,爆炸特效预制体或分数特效预制体有不同的,还需要分别制作。

游戏中的物体目前包括不交互的【背景】(背景天空,背景地面,背景小草等)
【游戏物体】(左右部分弹弓,小鸟,皮筋,小猪,障碍物)

背景的层级关系,可以通过order in layer手动调节,以正确显示,游戏物体则基本统一为一层,不发生层叠,弹弓处为例外,需单独调整。

游戏中的小猪和障碍物,手动摆放。

★★输赢界面制作

新建【ui】>【image】,双击它,点击其左上角的小框,按住alt可以改变填充。

改名字为lose,在其下建立三个图片分别是pig,home,retry,分别放置小猪图片,home按钮图片,retry按钮图片,其他诸如调颜色等的操作不再赘述。

选中lose,按ctrl+6打开动画编辑器,为该图片添加一个图片颜色的动画,设置第一帧的不透明度为0,保存动画。赢的界面与之相似,其他的不再赘述。

目前,有lose和win两个图片界面,这两个界面各自有一个动画状态机,各自有一个渐变效果的动画。

★★烟花特效(粒子系统)

在这里是导入烟花特效的包,里面有已经制作好的预制体,关于粒子系统参数的修改设置,在此处涉及不多,不再赘述。

★★渲染层级

【相机camera下的depth】,先绘制深度低的物体,前面的挡住后面的。
【同一个camera下的sorting layer】,层级数大的挡住小的
【同一个sorting layer下的order inlayer】,层级数大的挡住小的

区别于物体layer,大致作用类似于给不同物体的标签分类。

新建一个相机作为UICamera,渲染UI物体,这里有几项设置需要说明
【clear flags】设置为【只深度】,这样,在没有物体的地方,不显示东西。
【culling mask】设置为UI,表示只渲染UI层。
【projection】设置为正交。有透视和正交两个选项。
【depth】默认的主摄像机为-1,新建的摄像机设置为0。

在canvas中,将render mode 设置为相机,把刚建的UI相机赋值过来。

如此,将主摄像机的渲染UI层去掉,将特效root移动到每个要显示的星星下边,将层级设置为UI层,将粒子特效的sorting layer设置为player(这里是最上层显示,也可以设置成其他层),可以结合在场景视图中调整root的位置。

★★星星的逐一显示

在赢的UI中的win中,已经添加了一个动画,在激活win界面时,就会播放该动画,所以,给win添加一个脚本,写一个函数,
    public void Show) {
        GameManager._instance.ShowStar);
    }
调用,管理类中的星星播放函数,在win的动画结束帧添加事件调用脚本win中的函数,所以这里还要在管理类中写一个星星显示函数。如下
    public void ShowStar) {
        StartCoroutine”Show”);
    }
    //协程控制星星的生成
    IEnumerator Show)
    {
        for int i = 0; i < birds.Count + 1; i++)
        {
            yield return new WaitForSeconds0.4f);
            stars[i].SetActivetrue);
        }
    }
其中,涉及到了协程的基础使用方法,简单不赘述。
其中,新建了星星的gameobject数组,需要在编辑器赋值。
    public GameObject[] stars;

★★暂停界面UI

界面制作,不赘述。

在这里要先给暂停UI制作两个动画,一个是暂停UI出现,一个是暂停UI消失。

并给所有按钮图标添加上按钮组件,以便后续能够注册点击事件。

★★实现暂停和恢复的功能

首先是暂停UI动画状态机的设置,已经制作了两个动画,打开状态机,将默认动画设为新建一个空动画,空动画连接显示(添加bool变量值为true),显示连接隐藏(变量设为false),隐藏连接空。

然后开始写点击点击事件,给pauseUI添加代码,写上四个函数,分别是点击暂停,暂停动画结束,点击恢复,恢复动画结束,其内容如下:
    public Animator anim;
    public GameObject pauseButton;

    //点击暂停,隐藏暂停按钮,播放显示UI动画
    public void Pause) {
        pauseButton.SetActivefalse);
        anim.SetBool”ispause”,true);
    }
    //点击继续,游戏继续,播放隐藏UI动画
    public void Resume) {
        Time.timeScale = 1;
        anim.SetBool”ispause”, false);
    }
    //显示UI动画结束,游戏暂停
    public void PauseAnimatEnd) {
        Time.timeScale = 0;
    }
    //隐藏UI动画结束,显示暂停按钮
    public void ResumeAnimatEnd) {
        pauseButton.SetActivetrue);
    }
给各个按钮注册点击事件,给动画结束帧注册事件。

在GameManager类中添加home和replay事件函数,注意在这里我添加了重新设置时间尺寸的语句,因为我在暂停界面的按钮也是调用的管理类中的函数。
    public void Replay) {
        Time.timeScale = 1;
        SceneManager.LoadScene2);
    }
    public void Home) {
        Time.timeScale = 1;
        SceneManager.LoadScene1);
    }

★★相机的跟随运动

在小鸟的update中添加如下代码
        //相机跟随
        float posX = transform.position.x;
        posX = Mathf.ClampposX, 0, 15f);
        Vector3 targetPos = new VectorposX,
        Camera.main.transform.position.y,Camera.main.transform.position.z);
        Camera.main.transform.position = Vector3.Lerp
        Camera.main.transform.position, targetPos, smooth * Time.deltaTime);

这里使用了数学类中限制值的函数方法clamp,参数(要限制的值,最小值,最大值),还使用了插值运算,方法lerp,参数(开始位置,目标位置,平滑速度)

★★音效添加

在这里使用的是AudioClip静态赋值的方式播放。
    //声明
    public AudioClip select;
    public AudioClip 执着的小鸽子;
    //统一播放函数
    public void AudioPlayAudioClip clip){
        AudioSource.PlayClipAtPointclip, transform.position);
    }
    //调用播放
    AudioPlay执着的小鸽子);

另外,使用了碰撞体标签识别碰撞物体,选择性播放。
        if collision.gameObject.tag == “Player”) {
            AudioPlayaudioCollision);
        }
将这个代码写在小猪中,在这里的作用是,小猪和木板碰撞到小鸟后,小鸟发出碰撞的叫声。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注