unity-收集&tilemap拼接缝隙&collider碰撞摩擦&敌人

创建收集内容

  1. 新建收集object
  2. 添加sprite和动画
  3. 移动至合适位置
  4. 设置collider碰撞体
  5. 设置isTrigger,使之碰撞时触发一些改变
  6. 为object设置特有tag,便于写脚本时获取该object
  7. 编写脚本实现计数、销毁等操作
1
2
3
4
5
6
7
8
9
10
11
12
13
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag.Equals("Cherry"))
{
cherry++;
Destroy(collision.gameObject);
}
else if (collision.tag.Equals("Gem"))
{
gem++;
Destroy(collision.gameObject);
}
}

一些记录

is Trigger: 触发器 触发后会发生一些改变

inspector中: TagLayer

Perfabs: 一个预置,类似于一个模版

瓦片地图出现拼接缝隙

tilemapgridcellsize改为0.99

解决两个collider碰撞摩擦的问题(material材质)

  1. 创建physical material 2d
  2. 修改摩擦力friction为0
  3. 将材质放入需要的collider里的material中

解决角色可多次跳的问题

设置角色只有触碰地面才可以跳跃,无法在空中跳跃

1
2
3
4
5
6
7
8
9
public LayerMask ground;//图层

//角色跳跃
if (Input.GetButtonDown("Jump") && coll.IsTouchingLayers(ground))
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime);
anim.SetBool("jumping", true);

}

UI

  1. 新建UI画布canvas
  2. canvas内添加需要的内容
  3. 需要变化的变量在脚本中实现,unity中新建的UI是什么选项,脚本中就按该关键字获取UI
  4. 在unity脚本框内拖入相应的ui选项
1
2
3
4
5
using UnityEngine.UI

public Text CherryNumber;//新建Text类

CherryNumber.text = cherry.ToString();//将实际cherry值传给unity的Text类中

敌人

创建敌人

  1. 新建角色sprite
  2. 添加动画
  3. 添加刚体
  4. 添加collider。circle最好,可以保证移动时不翻转
  5. 给敌人加标签,便于编写脚本时获取

踩敌人消灭

判断角色是下落状态时,碰撞到敌人则destroy敌人

受伤

  1. 添加受伤动画
  2. Animator添加hurt标志,调整不同状态转换的条件
  3. 编写受伤脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[SerializeField]private bool isHurt;//判断是否受伤
//受伤动画转换
else if (isHurt)
{
anim.SetBool("hurt", true);
anim.SetFloat("running", 0);//保证受伤后处于静止状态而不是跑步状态
if (Mathf.Abs(rb.velocity.x) < 0.1) {//判断角色是否已经反弹结束处于静止状态
isHurt = false;
anim.SetBool("hurt", false);
anim.SetBool("idle", true);
}

}
//消灭敌人
private void OnCollisionEnter2D(Collision2D collision)//当该刚体碰撞另一个刚体时调用的函数
{
if (collision.gameObject.tag.Equals("Enemies")) { //函数代表的是整个碰撞器/刚体,故需要.gameObject获其角色类
//消灭敌人
if (anim.GetBool("falling"))
{
Destroy(collision.gameObject);
//增加消灭后再次小跳的效果
rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime);
anim.SetBool("jumping", true);
}else if(transform.position.x < collision.gameObject.transform.position.x)
{//增加受伤反弹的效果
rb.velocity = new Vector2(-5, rb.velocity.y);
isHurt = true;
}
else if (transform.position.x > collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(5, rb.velocity.y);
isHurt = true;
}
}
}

敌人移动AI

  1. 敌人角色下创建两个GameObject表示左右边界,设置移动边界位置(此时角色与边界为父子关系)
  2. 新建敌人脚本
  3. 新建两个Transform类表示左右边界,并在unity中拖入边界Object完成关联
  4. 在脚本中在start时获取边界的x值,然后将其边界Object销毁,保证其不随敌人角色移动
  5. 编写自动移动脚本
  6. 在unity设置初始speed使之移动
    (以下均可选)
  7. 添加跳跃动画
  8. 设置相关条件,并编写动画切换脚本
  9. Animation界面静止状态最后一秒新建事件event,设置其事件函数为移动的movement。使敌人角色在播放完静止动画后执行移动函数,进行跳跃等其他动作。此时不需要在update中每秒执行movement函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private Rigidbody2D rb;
//左右的行动边界
public Transform leftPoint,rightPoint;
private bool isFaceLeft = true;
public float speed;
private float leftx, rightx;//用于保存左右边界的x值

//敌人移动
void Movement()
{
if (isFaceLeft)
{
rb.velocity = new Vector2(-speed, rb.velocity.y);
if(transform.position.x < leftx)
{
//控制敌人面向右边,即掉头
transform.localScale = new Vector3(-1, 1, 1);
isFaceLeft = false;
}
}
else
{
rb.velocity = new Vector2(speed, rb.velocity.y);
if (transform.position.x > rightx)
{
transform.localScale = new Vector3(1, 1, 1);
isFaceLeft = true;
}
}
}
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2024 Aweso Lynn
  • PV: UV: