学习于:程序员咖啡吧(B站up)
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脚本里面了
我的百分比做的比较小哈哈哈
最后的导出游戏就是这样咯,进入文件--生成设置,将所有场景全钩上
然后就能导出了,如果效果不佳,没关系,可以回到工程文件,在改,为所欲为,嘿嘿
欧克差不多就这些了,感谢咖啡厅大佬的教学
附上:工程文件