触发器检测
在王者荣耀LOL中,我们进入敌人的防御塔范围后,敌方防御发就会触发攻击。
那么在Unity中怎么实现呢?
我们只需要在(Cube)物体的碰撞器组件上吧Is Triger 打钩这样碰撞器就会变成触发器了
Size X,Y,Z 可以调节触发器的大小
但是运行后会发现Cube直接掉下去了,这该怎么办呢?
我们只需要在刚体组件上面吧 受重力影响 去掉打钩 就可了
但是这样问题也来了,如果将Cube 的Is Triger 打勾,cube就不能被碰撞了,但是取消打钩 触发器就变成了碰撞器这个问题该怎么解决呢?
试想一下,王者荣耀 LOL 的防御塔 既能触发 , 防御塔又能被英雄碰撞
先把我们的 Cube 的碰撞器组件 跟刚体组件 Reset 一下(记得把Is Triger 取消打钩)
在Cube 添加组件处再添加一个碰撞器 选择球形碰撞器Sphere (因为防御塔的触发范围是圆的)
然后把刚添加的球形碰撞器里面的 Is Triger 打钩
Tirgger事件
OnTriggerEnter
//当有碰撞器的物体进入触发范围一瞬间
//进入触发器范围时调用一次
private void OnTriggerEnter(Collider other)
{
//如果进出触发范围的物体名字是Sphere
if (other.name=="Sphere")
{
//将Sphere名字的物体颜色变成blue
other.GetComponent<MeshRenderer>().material.color = Color.blue;
}
}
OnTriggerExit
private void OnTriggerEnter(Collider other)
{
//如果进出触发范围的物体名字是Sphere
if (other.name=="Sphere")
{
//将Sphere名字的物体颜色变成blue
other.GetComponent<MeshRenderer>().material.color = Color.blue;
}
}
//当有碰撞器的物体 在范围内退出时一瞬间
//退出触发器范围时调用一次
private void OnTriggerExit(Collider other)
{
//如果有碰撞器物体的名字是 Sphere
if (other.name == "Sphere")
{
//退出时变成黄色
other.GetComponent<MeshRenderer>().material.color = Color.yellow;
}
}
OnTriggerStay
//当有碰撞器的物体在触发范围停留时
//有碰撞器在触发器范围时持续调用
private void OnTriggerStay(Collider other)
{
if (other.name == "Sphere")
{
//颜色色变成黑色
other.GetComponent<MeshRenderer>().material.color = Color.black;
}
}
触发检测发生的必要条件
1.两个物体上必须有碰撞器组件,且至少有一个是触发器
2.两个物体之中至少有一个物体上有刚体组件
射线
实现射击小游戏
RaycastHit hit;
Transform firePint;
private void Start()
{
//在物体的第一个子物体位置生成开火点
firePint = transform.GetChild(0);
}
void Update () {
//下面的是利用射线 发射子弹的案例
//控制物体旋转
float hor = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up * Time.deltaTime * hor * 10);
//按下鼠标左键
if (Input.GetMouseButtonDown(0))
{
//从摄像机出发,到鼠标所在的位置发出一条射线,穿透屏幕打到场景里
if (Physics.Raycast(firePint.position, transform.forward, out hit))
{
if (hit.transform.name == "Cube")
{
GameObject bullet = Instantiate(bulletPrefeb, hit.point, Quaternion.identity);
Destroy(bullet, 4);
}
}
}
//绘画一条线在Scene窗口显示
Debug.DrawLine(firePint.position, firePint.forward*10+firePint.position, Color.red);
}
实现点击寻路
public GameObject bulletPrefeb;
Vector3 target;
private void Start()
{
firePint = transform.GetChild(0);
target = transform.position;
}
void Update () {
//下面是鼠标点击点击平面,物体匀速移动到平面上鼠标点击的位置
//物体匀速移动到目标位置
if (Input.GetMouseButtonDown(0))
{
// 射线 相机 屏幕的位置转射线 鼠标点击的位置
//从摄像机出发,到鼠标所在的位置发出一条射线,穿透屏幕打到场景里
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit))
{
if (hit.transform.name=="Plane")
{
target = hit.point+Vector3.up;
}
}
}
transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * 5);
}