当前位置:网站首页>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);
}
}
}边栏推荐
- [In-depth and easy-to-follow FPGA learning 15---------- Timing analysis basics]
- How to import game archives in joiplay emulator
- xss绕过:prompt(1)
- The difference between truncate and delete in MySQL database
- Steven Giesel recently published a 5-part series documenting his first experience building an application with the Uno Platform.
- 从编译的角度来学作用域!
- SWM32系列教程6-Systick和PWM
- pytorch的安装注意事项
- Necessary artifacts - AKShare quants
- 正则表达式密码策略与正则回溯机制绕过
猜你喜欢

transition transition && animation animation

software development design process

MySQL数据库(基础)

How to Repair Word File Corruption

Meeting OA project pending meeting, all meeting functions

Homework: iptables prevent nmap scan and binlog

天空云变化案例

joiplay模拟器如何使用

After writing business code for many years, I found these 11 doorways, which only experts know

软件开发设计流程
随机推荐
How to import game archives in joiplay emulator
What are the efficient open source artifacts of VSCode
45.【list链表的应用】
.NET Cross-Platform Application Development Hands-on Tutorial | Build a Kanban-style Todo App with Uno Platform
@requestmapping注解的作用及用法
The first level must project independently
ABC 261 F - Sorting Color Balls(逆序对)
从两个易错的笔试题深入理解自增运算符
MySQL数据库进阶篇
【VisDrone数据集】YOLOV4训练VisDrone数据集步骤与结果
宽客必备神器-AKShare
Shell编程条件语句 test命令 整数值,字符串比较 逻辑测试 文件测试
xss绕过:prompt(1)
XSS相关知识
what is jira
The difference between substring and substr in MySQL
Xss target drone training [success when pop-up window is realized]
MySQL的grant语句
Dry goods | 4 tips for MySQL performance optimization
SWM32系列教程6-Systick和PWM