笔记23 Unity项目:超级玛丽

  • 拖放地图,裁剪精灵,形成跑步动画,精灵渲染器
  • 摄像机跟随+代码CameraControl
  • 玛里奥动画
  • 给马里奥、地面等添加碰撞器、刚体(注意是2D的!)
  • 添加音乐播放器+代码AudioManager
  • 检测是否与地面碰撞(有两种方法)
    • 法一:利用射线检测是否碰到地面(适用此游戏)
    • 法二:不通过射线(不适用此游戏)
  • 敌人蘑菇+代码EnemyControl
  • 代码:马里奥PlayControl
    • 补充
      • 使用字符串(即动画名字)播放动画
      • 将名称(字符串)转成ID后使用
  • 静态金币+代码CoinStatic
  • 砖块+代码RockControl
  • 箱子、顶出动态金币+二者代码
    • 代码:箱子BoxControl
    • 代码:动态金币CoinControl
    • 顶箱子,顶出其他东西
  • 老师说要进行拓展练习(暂空)
  • 小记:《马里奥、〈白夜行〉、我》

拖放地图,裁剪精灵,形成跑步动画,精灵渲染器

摄像机跟随+代码CameraControl

    //跟随的物体public Transform target;//最小边界(能到的最左边)public float minX;//最大边界(能到的最右边)public float maxX;void Update () {//获取当前位置Vector3 pos = transform.position;//将它的x改成目标的xpos.x = target.position.x;//边界判断。需要传入两个边界if(pos.x > maxX){pos.x = maxX;}if(pos.x < minX){pos.x = minX;}//再赋值回去transform.position = pos;}

玛里奥动画

给马里奥、地面等添加碰撞器、刚体(注意是2D的!)

添加音乐播放器+代码AudioManager

   //音频播放器有了,首先写成单例类。public static AudioManager Instance;//写出两个播放器(背景音、音效)。然后到unity里关联(背景音,循环打钩)。public AudioSource bgmPlayer;public AudioSource sePlayer;void Awake(){//单例类一定要在Awake里面赋值。因为这个方法调用的时机比Start靠前。//这样可以保证在第一时间把这个单例做成。Instance = this;}// 下面给三个方法//一个播放bgm。传进来一个name,就是你播放的文件名称public void PlayMusic(string name){//如果当前没有播放,再去播放if (bgmPlayer.isPlaying == false){/*加载音频资源。类型AudioClip。从哪个位置加载?直接把name(外界传进来的)放那就可以了。*/AudioClip clip = Resources.Load<AudioClip>(name);//更换当前播放的声音片段bgmPlayer.clip = clip;//播放PlaybgmPlayer.Play();}}//停止播放public void StopMusic(){bgmPlayer.Stop();}//播放音效public void PlaySound(string name){/*加载音频资源。类型AudioClip。从哪个位置加载?直接把name(外界传进来的)放那就可以了。*/AudioClip clip = Resources.Load<AudioClip>(name);//播放音效sePlayer.PlayOneShot(clip);}

检测是否与地面碰撞(有两种方法)

法一:利用射线检测是否碰到地面(适用此游戏)

       //利用射线检测是否碰到地面(法一)//画出射线。从中心点出发,向下*0.1米。Debug.DrawRay(transform.position, Vector2.down * 0.1f);/*创建2d射线。特点:可以直接返回。3d返回的是布尔值,hit在上面,利用out给hit值。而且在括号里可以直接填写射线的起点,方向,距离,检测的层(此处是第8层)。*/RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down ,0.1f,1<<8);if(hit.collider != null){//说明碰到地面了isGround = true;//把跳跃的动画关闭ani.SetBool("Jump", false);}else{//没碰到地面(在空中)isGround = false;ani.SetBool("Jump", true);}

法二:不通过射线(不适用此游戏)

   //判断是否碰撞到地面(法二)。此处不适用,比如碰到左边碰撞体,可以二段跳。private void OnCollisionEnter2D(Collision2D collision){if (collision.collider.tag == "Ground"){isGround = true;}}private void OnCollisionExit2D(Collision2D collision){if (collision.collider.tag == "Ground"){isGround = false;}}

敌人蘑菇+代码EnemyControl

拖放,添加碰撞器、刚体,添加动画,编写代码,形成预设体。

    //血量public int Hp = 1;//刚体private Rigidbody2D rBody;//动画private Animator ani;//保存方向。方向分为1(正方向)和-1(负方向)。private int dir = 1;void Start () {//在这里得到rBody = GetComponent<Rigidbody2D>();ani = GetComponent<Animator>();     }void Update () {if(Hp <= 0){return;}/*移动(方向*速度)。为了使敌人碰到物体后向相反方向移动,此处乘以方向(上面设置了默认是正方向)。*///老师写的是Vector3.lefttransform.Translate(Vector2.left * 0.2f * dir * Time.deltaTime);}//不管碰到什么物体,都向反方向移动private void OnCollisionEnter2D(Collision2D collision){dir = -dir;//判断玩家碰到自己。注意给玩家标签。if(collision.collider.tag == "Player"){//contacts[0]碰撞的点,point代表拿到这一点的位置。//contacts[0].normal它还有一个法线,就是和碰撞点垂直的单位向量。//比如玩家从上面踩了蘑菇,会产生从碰撞点向下的法线。if (collision.contacts[0].normal == Vector2.down){//也就是说玩家从上方踩到,敌人死亡//拿到玩家身上的刚体组件,给它添加一个向上的力。collision.collider.GetComponent<Rigidbody2D>().AddForce(Vector2.up * 100f);//死亡方法写在外面,此处调用。Die();}else{//玩家从其他方向碰到敌人,玩家死亡//拿到玩家的代码,调用里面的Die方法。collision.collider.GetComponent<PlayControl>().Die();}}}//死亡void Die(){Hp--;if(Hp <= 0){//死亡//一秒之后销毁Destroy(gameObject, 1f);//动画ani.SetBool("Die", true);//声音AudioManager.Instance.PlaySound("踩敌人");/*碰撞器失效(因为死亡了,玩家踩到的时候不能再触发事件。而之所以能产生事件,是因为碰撞器的存在)*/GetComponent<Collider2D>().enabled = false;//删除刚体(碰撞器也可以用此方法。如果删除了碰撞器,而没有删除刚体,那么蘑菇会掉下去。)Destroy(GetComponent<Rigidbody2D>());}}

代码:马里奥PlayControl

    //人物的血量public int Hp = 1;//是否在地面private bool isGround = false;//刚体private Rigidbody2D rBody;//动画private Animator ani;//获取精灵图片(为了后面翻转图片)private SpriteRenderer sr;void Start () {//在此处拿到这两个组件rBody = GetComponent<Rigidbody2D>();ani = GetComponent<Animator>();sr = GetComponent<SpriteRenderer>();}void Update () {if (Hp <= 0){return;}//因为人物只是左右跑,所以拿水平轴float horizontal = Input.GetAxis("Horizontal");//如果水平轴不为0if (horizontal != 0){//前进transform.Translate(transform.right * Time.deltaTime * 1 * horizontal);//翻转图片(模拟转头)if (horizontal > 0){//说明是往右边走所以不翻转sr.flipX = false;}if (horizontal < 0){sr.flipX = true;}//移动动画ani.SetBool("Run", true);}else{ani.SetBool("Run", false);}//跳跃。按了I键,并且人物是站在地上的。if (Input.GetKeyDown(KeyCode.I) && isGround == true){//跳跃力(向上,作用在刚体上)rBody.AddForce(Vector2.up * 200);//播放跳的声音AudioManager.Instance.PlaySound("跳");}//利用射线检测是否碰到地面(法一)//画出射线。从中心点出发,向下*0.1米。Debug.DrawRay(transform.position, Vector2.down * 0.1f);/*创建2d射线。特点:可以直接返回。3d返回的是布尔值,hit在上面,利用out给hit值。而且在括号里可以直接填写射线的起点,方向,距离,检测的层(此处是第8层)。*/RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.1f, 1<<8);if(hit.collider != null){//说明碰到地面了isGround = true;//把跳跃的动画关闭ani.SetBool("Jump", false);}else{//没碰到地面(在空中)isGround = false;ani.SetBool("Jump", true);}     }//玩家的死亡方法,因为在敌人的代码里调用,所以此处是publicpublic void Die(){Hp--;if (Hp <= 0){//死亡ani.SetTrigger("Die");//删除碰撞器。(因为玩家死亡时,是从场景中掉落的,所以只要删除碰撞器,不删刚体)。Destroy(GetComponent<Collider2D>());//停止播放背景音乐AudioManager.Instance.StopMusic();//播放死亡音乐AudioManager.Instance.PlaySound("死亡");//让玩家静止rBody.velocity = Vector2.zero;//让玩家静止,即将它的速度设为0。为了避免玩家在不同情况下死亡后,向上跳的高度不同)rBody.velocity = Vector2.zero;//跳跃。给一个向上的力rBody.AddForce(Vector2.up * 150f);//延时。1秒之后播放Invoke("Die2", 1f);}}void Die2(){AudioManager.Instance.PlaySound("死亡2");}

补充

使用字符串(即动画名字)播放动画

    ////移动动画ani.SetBool("Run", true);

将名称(字符串)转成ID后使用

每个动画都有一个ID。
因为系统开辟字符串比开辟整形更加费性能,如果一个动作需要多次使用,优化方法:
在最开始的时候(Start里),把动作都转成int类型,用的时候,只要用int类型就好。

    //移动动画int run = Animator.StringToHash("Run");//Debug.Log(run);打印IDani.SetBool(run,true);//获取数值bool res = ani.GetBool(run);

静态金币+代码CoinStatic

    //触发private void OnTriggerEnter2D(Collider2D collision){if(collision.tag == "Player"){//播放声音AudioManager.Instance.PlaySound("金币");//销毁自己Destroy(gameObject);}}

砖块+代码RockControl

    //大砖块public GameObject Rock;//小砖块public GameObject[] Rocks;//写完上面的代码,需要到unity里面关联一下。// Use this for initializationvoid Start () {}private void OnCollisionEnter2D(Collision2D collision){//如果玩家碰了我,并且碰撞点的法线向上(说明玩家是从线面碰到的)if (collision.collider.tag == "Player" && collision.contacts[0].normal == Vector2.up){//播放音乐AudioManager.Instance.PlaySound("顶破砖");//小砖块会四散开来。首先遍历一下foreach(GameObject rock in Rocks){//把父物体(大砖块)设置为空,小砖块就没有父物体了,会显示在前面rock.transform.parent = null;//3D有爆炸力,2D没有。首先,添加刚体。rock是4个小砖块Rigidbody2D rbody = rock.AddComponent<Rigidbody2D>();//得到从整体的中心点到各个小砖块中心点的向量。Vector2 dir = rock.transform.position - transform.position;//给力。dir沿着这个向量的方向*100的力rbody.AddForce(dir * 900f);//1秒之后销毁Destroy(rock, 1f);}//销毁大砖块Destroy(gameObject);}}

箱子、顶出动态金币+二者代码

代码:箱子BoxControl

    //血量。(顶几次)public int Hp = 5;//顶出来的物体public GameObject goPre;//音效名称(传进来)public string sound; void Start () {}private void OnCollisionEnter2D(Collision2D collision){//如果玩家从下面顶撞if (collision.collider.tag == "Player" && collision.contacts[0].normal == Vector2.up){if(Hp > 0){Hp--;//顶出物品//声音AudioManager.Instance.PlaySound(sound);//实例化物品Instantiate(goPre, transform.position, Quaternion.identity);if(Hp <= 0){//变成砖块(就是下面的“没了”)//获得动画GetComponent<Animator>().SetTrigger("Die");}}else{//箱子已经没了。//播放没了的声音AudioManager.Instance.PlaySound("顶砖石块");}}}

代码:动态金币CoinControl

   void Start () {//获得刚体GetComponent<Rigidbody2D>().AddForce(Vector2.up * 150f);//销毁金币Destroy(gameObject, 1f);}

顶箱子,顶出其他东西

老师说要进行拓展练习(暂空)

小记:《马里奥、〈白夜行〉、我》

笔记23 Unity项目:超级玛丽相关推荐

  1. 【B站弹幕游戏开发笔记01】Win10系统下给Unity项目导入Protobuf

    Protobuf Github地址:https://github.com/protocolbuffers/protobuf 类库创建项目 使用vs2019 使用NuGet导入Google.Protob ...

  2. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  3. 2021Unity学习教程:本地下载的Unity项目怎么打开?

    2021Unity学习教程:Unity项目怎么打开? 前言:很多人想通过下载学习Unity项目资源来快速上手Unity,但初学者有时在打开文件这一步就遇到了问题.其实,Unity项目工程需要在Unit ...

  4. 【三星官方教程】如何为Gear VR 开发应用(二):创建Unity项目

    关于项目创建与Demo导入 本系列教程将介绍如何用 unity 为Gear VR开发一个360度照片查看器.在开始用Unity为Gear VR开发应用前,需要完成Unity和Oculus的整合,并导入 ...

  5. StatQuest学习笔记23——RNA-seq简介

    StatQuest学习笔记23--RNA-seq简介 前言--主要内容 这篇笔记是StatQuest系列笔记的第58节,主要内容是讲RNA-seq的原理.StatQuest系列教程的58到62节是协录 ...

  6. 程序的加载和执行(三)——《x86汇编语言:从实模式到保护模式》读书笔记23

    程序的加载和执行(三)--读书笔记23 接着上次的内容说. 关于过程load_relocate_program的讲解还没有完,还差创建栈段描述符和重定位符号表. 1.分配栈空间与创建栈段描述符 462 ...

  7. JAVA自学笔记23

    JAVA自学笔记23 1.多线程 1)引入: 2)进程 是正在运行的程序.是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程: 单进程的计算机只能做一件事情,而现在 ...

  8. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)--Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为"demo" scrapy startproject demo cd demo ...

  9. Unity Hub和Unity项目的关系

    在之前的一些版本中,下载Unity引擎是直接下载相应的Unity版本就可以运行项目了,但是现在Unity引入了Unity Hub来管理,所以之前的版本就不讨论了,我们现在说一下如何用Unity Hub ...

最新文章

  1. 改造HINT的输出方式
  2. linux 下批量修改文件的编码
  3. 宁波大学计算机王老师,王翀_宁波大学研究生导师信息
  4. zookeeper原理与使用
  5. YOLOv3最全复现代码合集(含PyTorch/TensorFlow和Keras等)
  6. python3.6安装tesserocr
  7. c++使用Vigenere加解密文本的算法(附完整源码)
  8. C语言中的数据类型在VB中的申明
  9. 利用matlab实现SAR 图像线性拉伸显示
  10. 用JS写的取存款功能
  11. 洛谷P1725琪露诺【单调队列+dp】
  12. no such file or directory什么意思_为什么这次 MySQL 崩溃恢复要这么久-爱可生
  13. java输出到文本_java怎么把运行结果写到一个自动生成的文本里?。能给个例子么,详细点...
  14. MFC开发IM-第十八篇、如何设置编辑框的内容
  15. numpy 高阶函数 —— np.histogram
  16. python 列表的增删改查
  17. 移动前端的一些坑和解决方法(外观表现)
  18. ASP.NET 首页性能的4大做法
  19. 红外解码软件 android,红外线遥控器软件解码程序(能解大部分遥控器的编码)
  20. 如何培养卓越的执行力

热门文章

  1. 《图解机器学习》(杉山将.著)笔记——第一章 什么是机器学习
  2. 张玲专家:传承中医精髓,严谨辨证治疗
  3. [术语对照]-天文学术语中英对照
  4. 介绍一款原创的四则运算算式生成器:CalculateIt2
  5. SpringBoot 集成Guacamole客户端
  6. 如何将多张健康码行程码拼接在一起合成一张图片呢?日常生活中,有用的拼图小程序分享
  7. 华为OD机试题【用户调度】用 C++ 编码,速通 (2023.Q1)
  8. Windows记事本
  9. 【正点原子FPGA连载】第十四章 IP核之RAM实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
  10. 浅析王老吉的地震事件营销