当前位置:网站首页>unity2D横版游戏教程4-物品收集以及物理材质
unity2D横版游戏教程4-物品收集以及物理材质
2022-07-31 00:19:00 【真的没事鸭】
我们先把背景扩大一点,ctrl+D复制一个背景图然后调一下位置,在把地图稍微拓展一下

然后再Hierarchy界面创建一个空组件命名为Collection,表示物品,创建一个空的子组件叫Cherries,这个就是樱桃物品,可以拾取的,右边属性栏给Cherries添加一个Sprite Renderer(精灵渲染器)

接下来我们就要给Cherries设置模型了,我们到Item文件夹,这里有三种不同的物品,第三个文件夹就是一些水果,我们选择樱桃,别忘了把樱桃的像素改成32

然后我们把第一帧的动画拖到Cherries的Sprite Renderer

设置一下图层顺序,设置成我们之前已经设置过的Collection图层,这样在场景里就可以看到这个物品了

然后我们给物品添加一个动画效果,和之前的人物动画一样,这里就略过了,忘的话可以翻一下前面的文章,做好动画之后,我们还需要给Cherries添加碰撞体,属性栏那里给Cherries添加一个circle Collider 2D

调整一下位置,然后勾选Is Trigger,把这个碰撞体当做一个触发器

然后我们就要写一点代码
首先创建一个计数的变量,用来统计角色的分数或收集的物品数量

还有就是角色撞到物品将物品销毁并且计数的变量加1
我们把这个樱桃当做了一个Trigger(触发器),所以我们用Trigger的类型来判断是否是可以收集的物品,这里Trigger的类型通过设置物品的Tag来区分

新建一个Tag,命名为Collection

然后我们将樱桃的Tag改成Collection,后面不同类型的可收集物品的Tag都改成Collection

设置完Tag之后我们在代码里面写一下就可以了

这里输出cherries的值来debug,我们回到unity运行,当我们碰到樱桃时会打印一下cherries的值是1

别忘了把我们debug的那行代码给注释掉
我们现在只在地图上放了一个樱桃,如果我们想要放更多的樱桃就要一个一个去放置,并且如果想对所有的樱桃进行改动的话需要一个一个的去设置,这里我们引入预制体(Perfabs)的概念,预制体的作用就是可以重复的利用资源。场景中重复使用的对象都有尽可能的做成预制体。
我们通过将Hierarchy中的物体反方向拖进文件夹就可以将这个物体做成预制体,然后将文件夹里的预制体拖到场景中就变成了预制体实例。我们修改预制体,所有的预制体实例都会跟着修改,我们修改预制体实例,其他的预制体实例包括预制体不会改变。
所以我们有了预制体之后就可以不断的复制它,当想要更改时修改预制体所有的预制体实例就跟着更改了,如果想对预制体有更深的了解可以参考这篇文章详解Unity中的预制体_梦小天幼的博客-CSDN博客_unity预制体
然后我们创建一个文件夹,命名为Prefabs,然后将Hierarchy里面的cherries拖进Prefabs文件夹,这样就有了cherries预制体,这时候cherries会变成蓝色。

然后我们ctrl+D复制一下cherries,给地图添加多一点的樱桃

这样收集物品就做好了,下面我们修改一下角色会卡在其他碰撞体上的bug。角色自己有一个碰撞体,tilemap也有一个碰撞体,所以当角色碰到其他物体时会卡在物体上面,因为会发生摩擦,我们给角色添加一个光滑的物理材质
我们在Assets文件夹右键->Create->2D->physics Material 2D,创建一个2D的物理材质

然后将这个材质的两个参数都调为0,friction是摩擦力,bounciness是反弹力

然后将这个材质拖给角色的circle collider 2D

这样我们的角色就不会和其他的碰撞体发生摩擦了
最后把完整的代码贴一下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playercontroller : MonoBehaviour
{
private Rigidbody2D rb;//获得Rigidbody2D组件
private Collider2D coll;//获得Collider2D组件
private Animator anim;//获得动画组件
public float speed, jumpForce;//公开,设置速度和跳跃力
public LayerMask ground;//获得地面图层
public Transform groundCheck;//检测角色是否碰到地面
private bool isJump, isGround;//判断是否按下空格键,判断是否在地面
private int jumpCount;//用来设置角色是几段跳
private int cherries;//计数变量
//初始化
void Start()
{
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<Collider2D>();
anim = GetComponent<Animator>();
}
void Update()
{
//如果按下空格键并且在地面上
if (Input.GetKeyDown(KeyCode.Space) && jumpCount > 0)
{
isJump = true;
}
}
private void FixedUpdate()
{
isGround = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);
Movement();
Jump();
SwitchAnim();
}
//基础移动
void Movement()
{
float horizontal = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);//设置x轴的移动
//设置角色的转向问题
if (horizontal != 0)
{
transform.localScale = new Vector3(horizontal, 1, 1);
anim.SetBool("run", true);
}
else
anim.SetBool("run", false);
}
//跳跃
void Jump()
{
//如果在地面设置二段跳
if (isGround)
{
jumpCount = 2;
}
//按下跳跃键且在地面上
if (isJump && isGround)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
jumpCount--;
isJump = false;
}
//按下跳跃键且不在地面上且jumpCount大于0
else if (isJump && !isGround && jumpCount > 0)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
jumpCount--;
isJump = false;
}
}
//切换动画
void SwitchAnim()
{
//如果在下落状态
if (rb.velocity.y < 0 && !isGround)
{
anim.SetBool("fall", true);
anim.SetBool("jump", false);
}
//如果在跳跃状态
if (!isGround && rb.velocity.y > 0)
{
anim.SetBool("jump", true);
}
//如果在地面上
else if (coll.IsTouchingLayers(ground))
{
anim.SetBool("fall", false);
}
}
//判断是否碰到物品
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag=="Collection")
{
Destroy(collision.gameObject);
cherries++;
//Debug.Log(cherries);
}
}
}边栏推荐
猜你喜欢
Go 学习笔记(84)— Go 项目目录结构

H5跳转微信公众号解决方案

【深入浅出玩转FPGA学习15----------时序分析基础】

消息队列存储消息数据的MySQL表设计

Summary of the stock problem of state machine dynamic programming
![[In-depth and easy-to-follow FPGA learning 13---------Test case design 1]](/img/1c/a88ba3b01d2e2302c26ed5f730b956.png)
[In-depth and easy-to-follow FPGA learning 13---------Test case design 1]

joiplay模拟器如何导入游戏存档

Steven Giesel 最近发布了一个由5部分内容组成的系列,记录了他首次使用 Uno Platform 构建应用程序的经验。

joiplay模拟器报错如何解决

firewalld
随机推荐
Bypass of xss
[Meng Xin problem solving] Delete the Nth node from the bottom of the linked list
Restricted character bypass
Mysql体系化之JOIN运算实例分析
Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv
Shell脚本 if语句
xss绕过:prompt(1)
Game mall table establishment
【深入浅出玩转FPGA学习13-----------测试用例设计1】
从笔试包装类型的11个常见判断是否相等的例子理解:包装类型、自动装箱与拆箱的原理、装箱拆箱的发生时机、包装类型的常量池技术
background对float的子元素无效
MySQL数据库约束,表的设计
Error occurred while trying to proxy request项目突然起不来了
Ukraine's foreign ministry: wu was restored to complete the export of food security
MPI简谈
Shell script if statement
写了多年业务代码,我发现了这11个门道,只有内行才知道
[In-depth and easy-to-follow FPGA learning 15---------- Timing analysis basics]
【VisDrone数据集】YOLOV4训练VisDrone数据集步骤与结果
MySQL数据库进阶篇