所谓碰撞检测,就是指检测游戏对象之间是否发生了碰撞的处理。检测碰撞是否发生的过程称为碰撞检测,碰撞发生后的行为则称为碰撞处理。
5.1碰撞检测算法要严格检测对象之间是否发生碰撞,必须判断两个对象的轮廓线是否相交,但这样处理计算量比较大,脚本的编写也很复杂。所以我们在本节的碰撞检测中使用比较简单的算法来实现。
简单的碰撞检测算法:把对象的形状简单地看作圆形,这样的话,只要知道圆心的坐标和半径就可以对碰撞进行检测。利用两个圆的圆心坐标即可计算出两个圆的圆心之间的距离,公式如下:
如果圆心的距离 d 大于两个圆的半径之和,说明两个圆没有相交;相反,如果 d 小于两个圆的半径之和,则说明两个圆相交。
5.2编写碰撞检测脚本接下来,我们在上一节的使箭头下落的脚本中增加碰撞检测功能。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArrowController : MonoBehaviour
{
GameObject player;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find("player");
}
// Update is called once per frame
void Update()
{
transform.Translate(0, -0.1f, 0);
if (transform.position.y < -5.0f)
Destroy(gameObject);
// 碰撞检测
Vector2 p1 = transform.position;
Vector2 p2 = player.transform.position;
Vector2 dir = p1 - p2;
float d = dir.magnitude;
float r1 = 1.0f;
float r2 = 0.5f;
if (d < r1 r2) {
Destroy(gameObject);
Destroy(player);
}
}
}
运行游戏,看看效果!
在上面的碰撞检测代码中,两个游戏对象的坐标分别保存在两个 Vector2 变量中,这两个 Vector2 变量的差值表示从 p2 指向 p1 的向量,通过的向量的 magnitude 属性可以获取到该向量的长度。然后检测这个长度与两个半径之和的关系,如果检测到碰撞了,则将两个游戏对象销毁掉。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved