unity制作滚动的天空简易版(在b站学的,此处总结,供学习)

学习于:程序员咖啡吧(B站up)

程序员咖啡吧的个人空间_哔哩哔哩_bilibili

unity不是中文版没关系一样的。

欢迎大佬指教,我要复习去了

话不多说先了解游戏分为几个部分:

人物,摄像头,环境,可互动的物品,(有些有关卡,npc,特效)

制作游戏的步骤依次大概是以下的几个

1、人物(player)

2、障碍物(obstacle)还有装饰品(天空盒去unity商店免费的一大把,美哭你)

3、起点终点(start 和 endline)

4、还有特效(这里咱是简易版就不要自行车了,我们只做死亡特效)

5、UI和关卡建立(结束动画,按钮的使用)

6、脚本(API,这里我用的是vs,不用记事本是,为了编辑器自动检查错误,嘿嘿)

好了先建个球(player,这个球可以搞个材质球,在下面的assets里面先右键创建一个materials,在右键点材质,就会出现一个材质球,你设置好后,用左键托住到场景中的 球 上,球立马就变色了)

地板(ground,就是个马路现状的方块,这个应该会吧,要记住自己设置的xyz位置,因为掉落死亡,是通过判断player的坐标在哪,来触发死亡事件的)

第一部分              完善人物的视角,运动,通关和死亡

我的球是个屎黄色的,首先要调整摄像头的位置于球连体

第一步:先创建空对象名字叫:camera ancher

第二部:将main camera托到这个空对象里面

第三步:编程会吧,我们在assets里建一个右键创建一个c#脚本:CameraFollow

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

public class CameraFollow : MonoBehaviour
{
    public Transform player;
    void Update()
    {
        if (player != null)
        {
            transform.position = player.position;//将摄像头位置于摄像头跟随
        }
    }
}

--将脚本托到  camera ancher  的检查器里,就会自动将脚本附着在上面,就能用脚本了

这里我们需要将Transform player设置为我们的player,也就是那个球

第四步:将左键球体

托到那个脚本的Player框里,就会这样子

这样设置完成了,但你需要将摄像头调一下位置放在球的上面

 

如果点启动按钮就会进入游戏开始的界面,如果球在摄像头中间并能看见前面的路那你就成功了

 

 欧克

现在写人物运动的脚本,那个球还在吧,地板还在吧

嘿嘿,先设置地面的物理属性不能是个幽灵物件,直接魂穿,所以要点地板在检查器里点  添加组件  的按钮

--盒装碰撞器(Box Collider)

那你应该想到,人走在地上得是个人(球),得有重力,不然就掉下地板了,而且得是个实体,所以要   添加组件   

--加上球状碰撞器(Sphere Collider ),还有个刚体(rigidbody)

--设置质量为1,阻力为1,角阻力为0.05,点使用重力

搞好了没,搞好了,然后开始写人物运动脚本。

在assets里面搞一个c#脚本叫playmovement

using UnityEngine.SceneManagement;
using UnityEngine;

public class playmovement : MonoBehaviour
{

    public float Speed;
    public float movespeed;
    public Rigidbody rb;
    public GameObject dieeffect;
    public Transform EndLine;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Hello world!");//会在控制台打印,可以验证脚本或者编辑器有没有问题
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.A))//如果按了a键就向左加刚体力
        {
            rb.AddForce(movespeed * Vector3.left * Time.fixedDeltaTime, ForceMode.VelocityChange);
        }
        if (Input.GetKey(KeyCode.D))//如果按了D键就向右加力,有人问为啥不用一直改变能,笨蛋,那样物体运动不够平滑,没有过程,可能会跳帧。
        {
            rb.AddForce(movespeed * Vector3.right * Time.fixedDeltaTime, ForceMode.VelocityChange);
        }
        if (Input.GetKey(KeyCode.W ))
        {
            rb.AddForce(0 * Vector3.forward  * Time.fixedDeltaTime, ForceMode.VelocityChange);
        }//这里就速度为0,加了加速,不好控制,嘿嘿

        int index = SceneManager.GetActiveScene().buildIndex;

        if (transform.position.y <= -3.0f && index!=6) 
        {
            Die();
        }//掉下地板咋办,给爷死!!!如果y坐标小于等于-3,就直接死
    }

    private void FixedUpdate()
    {
        rb.AddForce(Speed * Vector3.forward * Time.fixedDeltaTime , ForceMode.VelocityChange);
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "obstacle")
        {
            Die();//如果装上的障碍物的标签为obstacle就死,懂得都懂
        }
    }

    public void  Die()//死亡的方法
    {
        Debug.Log("玩家死了");
        Instantiate(dieeffect, transform.position, Quaternion.identity);//这里调用的触发器,如果撞到了过关的触发器,就会先死掉,然后进入UI为  通关   的界面,后面有讲怎么搞
        FindObjectOfType<GameManager>().PlayerDie();//这里调用死亡特效,后面也有讲
        Destroy (gameObject );//死了就摧毁原物件,没毛病
    }
    public float GetPercentage()
    {
        return 100 - (EndLine.position.z - transform.position.z) / EndLine.position.z * 100;
    }
}

将上面这个脚本托到player就是那个球的检查器里面,就能用这个脚本了,是不是报错呀,因为里面的调用要用其他未写的脚本里的东西,没关系将多余的的东西删了,你先测试它能不能走动,保留运动的那部分就好。

第二部分                             制作障碍物

障碍物你可以搞任意形状的都没关系的,这里用的是方块,障碍物名自己取,添加好组件后,还不能用,因为需要标签

上面图里面是不是有个标签叫obstacle,这标签名可以自己设置的,它的作用就是类似,你的班干部,职位,如果player碰到它了,那么,player会判断它的标签叫来做相应的事情,如果标签是obstacle就死亡,如果叫endline就通关,如果叫。。。以此类推,

如何制作标签呢,点标签框,框下面有一个添加标签,会出现下面这种情况,然后点   +   按钮就可以添加了,设置标签名为obstacle,点save保存,欧克

 接着在点方块,在标签出换上,就可以了。

 制作障碍物是有可能会有多种情况,但为了方便,可以点障碍物方块按住  ctrl+d   就会复制并粘贴,这时方块是重合地点,就可以改变其中一个方块的位置来托开,非常好用!!!

 无用小技巧: 如何大量制作重复场景呢,嘿嘿,可以先创建空对象取个名,将一系列的障碍物放到里面,点空对象,你可以同时改变,所有里面的东西的坐标,同时你可以复制空对象,获得大量重复物体

是不是很快就能搭建巨大的环境场景了,绿色的方块可以放在两边,烘托气氛,图片里是不是黑乎乎的,那是因为我加了一点点的雾,没关系,咱可以不搞。

第三部分                                起点和终点

这个我就在初始位置搭了个门就完事了,但是终点是要通关的,咱们可以这样搞

在终点做一面墙,名字叫Endline Trigger,让player可以在地面尽头撞上它,

 在盒状碰撞器里钩上    是触发器    就可以让他成为触发器。

聪明的小伙伴就可能发现了,那能不能用标签来实现通关呢,也可以,不过你的自己去摸索了,咱先搞触发器的版本

 

 做好墙面后,开始制作脚本,名字叫   endlinetrigger

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

public class endlinetrigger : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            //玩家过关了
            Debug.Log("玩家过关了");
            FindObjectOfType<GameManager>().LevelComplete();
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

然后将脚本托到Endline Trigger上面进行使用

下面制作管理器

这里由于后面的player行为会有点多,我们可以创建一个GameManager,脚本图标会变成齿轮状。

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

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    public void PlayerDie()
    {
        Invoke("ReloadScene",2f);//人物死亡延迟2秒,重新开始本关卡
    }

    public void ReloadScene()
    {
        SceneManager.LoadScene (SceneManager.GetActiveScene ().buildIndex);//获取本关卡的标志数(index),并重新载入本关卡。

    }
    // Update is called once per frame
    public void LevelComplete()
    {
        FindObjectOfType<GameUI>().DisplaylevelComplete();//通关会进入UI
    }

    public void NextLevel()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene ().buildIndex+1);//获取本关的标志数(index),然后加一,进入下一下关
    }

    
}

通关进入UI,所有许多单机游戏进入背包会游戏暂停,其实本关卡已经被暂停了。

老规矩先删没必要的,咱先测试。将endlinetrigger里的这个改成直接重新加载关卡

private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            //玩家过关了
            Debug.Log("玩家过关了");
            FindObjectOfType<GameManager>().ReloadScene();
        }
    }

看看撞上通关触发器,通关会不会将本关卡重置。成功咋就接着来

第四部分               死亡特效

先右键创建    效果--粒子系统   ,然后设置粒子系统的参数

1、先取消   循环播放

2、起始生命周期改为2,起始速度改为在   两常数间随机   10     30

3、重力修改器为5

4、

 5、

 将材质改为player的那个材质包就欧克,将这个挂在player上面

最后第五部分               UI和关卡切换

首先造一个开始游戏的UI

在assets里创建一个文件夹叫start

 右键创建--UI--图像(image),这是会有一个图像框你要将它铺满屏幕

 为了将白屏调成全屏要在右边的

点这个,然后按住alt,右键点右下角的选项就会将它铺满

 右键创建--UI--按钮,然后设置按钮,按钮有俩层

外面的是按钮实体,即可以点击的区域,可以通过先方块放大缩小的方式进行放大

里面是text文本框,点击它可以,将框内字体改变,还可以像word一样放大缩小字的大小,也可换字体,

 换框的颜色

将按下颜色和其他的不一样就好了,这样就能判断按钮是否有效,我们是否点击成功。

接下来就是写加载关卡脚本了,我是将脚本名和关卡名做的一样的。

将脚本挂在  canvas  上,然后在

 在按钮里点     +  号添加点击的对象添加为canvas,然后选择调用脚本里的哪个函数,就ok拉,这样点一下就会直接使用这个函数           LEVEL1        的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LEVEL1 : MonoBehaviour
{
    public void LoadScene()
    {
        SceneManager.LoadScene("LEVEL1");
    }
}
是不是很简单,你可以设计更加离谱的按钮功能,这里只演示了跳转关卡的功能,这样我们点play按钮就会直接开始第一关,呜呼呼。

如何查看关卡呢点 文件--生成设置

改关卡名字和脚本里的匹配,不然会报错

下面开始学习怎么造动画吧。就是过关会有通关的提示。为了字更加明显我们用黑色背景

画面铺满会把,调背景颜色会把,欧克

直接开始把!

先造一个管理器,像之前那个gamemanager一样

来一个gameUI脚本

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

public class GameUI : MonoBehaviour
{
    public Text percentage;
    public GameObject Finishpanel;
    public Animation anim;
    public Transform player;
    // Start is called before the first frame update
    void Start()
    {
       Finishpanel.SetActive(false);
    }
     void Update()
    {
        if (player != null)
        {
            percentage.text = FindObjectOfType<playmovement>().GetPercentage().ToString("F0") + "%";
        }
    }

    public void DisplaylevelComplete()
    {
        anim.Play();
    }

    public void NextLevel()
    {
        FindObjectOfType<GameManager>().NextLevel();
    }
}

 在第一关那里创建一个UI--图像,将它铺满调黑,再在canvas里创建一个文本(text)

写下通关庆祝语

 在第一关点动画框

在这里添加动画,名字叫finishpanle

 然后点预览将帧变红,然后设置第一个帧,点文本,然后将

 最先面的那个调A透明度调一下然后调为0   ,  你会发现时间轴上多了个点

第一个帧调好

将白线就正在播放的时间往后调,然后将透明度调满255

最后再在一个地方找到一个点,将透明度调为0

 

 你播放看一下效果,OK就行最后在写一个调用动画的脚本,对,你没听错,万物皆需脚本。

脚本名为finishgame

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class finishgame : MonoBehaviour
{
    public Animation anim;
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            //玩家过关了
            Debug.Log("玩家通关了");
            SceneManager.LoadScene("OVER");
            anim.Play();
        }
    }

}

在第一关的canvas中创建一个组件--Animation(动画)
将脚本挂在组件内

 如果想要百分比的UI直接写在canvas里面,添加一个文本找好位置然后名字叫percentage就可以了因为已经写在gameUI脚本里面了

 

我的百分比做的比较小哈哈哈

最后的导出游戏就是这样咯,进入文件--生成设置,将所有场景全钩上

 然后就能导出了,如果效果不佳,没关系,可以回到工程文件,在改,为所欲为,嘿嘿

欧克差不多就这些了,感谢咖啡厅大佬的教学

附上:工程文件

猜你喜欢

转载自blog.csdn.net/m0_65045773/article/details/125582580