直奔主题,缓动瞄准射击的坦克。首先,需求的几个要素。
1,炮台和子弹预制体设置。
2,代码部分
首先说预制体。
因为是3D场景,我所有元素都加了贴图。贴图移除不影响逻辑效果。
Tanker 分为底座(包含球形碰撞器和刚体),炮筒(用于指向发射目标,包含球形碰撞器和刚体),和射击范围(用于判定攻击距离和间隔,是一个球形碰撞器)。炮筒部分包含射击位置(用于确定发射位置)。
Zidan 只是一个克隆的球。(包含球形碰撞器和刚体)
代码部分
Tanker部分代码。脚本挂在atksize上面(必要)把Public对应的物体拖到对应位置即可。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddTanker : MonoBehaviour {
private float Atk_time;//攻击时间
public Transform tanker_trans;//控制炮筒转向的trans 对应预制体tank_trans
public GameObject Zi_dan;//子弹的预制体 对应预制体Zidan
public Transform shoot_trans;//子弹克隆的位置 对应预制体ShootPos
// Use this for initialization
void Start()
{
}
//碰撞检测
void OnTriggerStay(Collider obj)
{ //目标obj进入范围
if (obj.tag == "Enemy")
{
//LookAt指向目标。进入范围瞬间指向,这里没有使用此方法
//tanker_trans.LookAt(obj.transform);
//缓动指向,平缓速度指向目标 5F可调整,用作转向速度,缺点是仅向目标方位,精确度低。
Quaternion rotation = Quaternion.LookRotation(obj.transform.position - tanker_trans.transform.position);
tanker_trans.rotation = Quaternion.Slerp(tanker_trans.rotation, rotation, 5f * Time.deltaTime);
Atk_time += Time.deltaTime;
//进入范围攻击时间
if (Atk_time > 1.5f)
{
GameObject.Instantiate(Zi_dan, shoot_trans.position, shoot_trans.rotation);
Atk_time = 0;
}
}
}
}
子弹部分只有一句代码,挂在Zidan预制体上即可。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZiDan : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//子弹飞行代码
transform.Translate(Vector3.forward * 50.0f * Time.deltaTime);
}
void OnTriggerEnter(Collider obj)
{
if (obj.tag=="Enemy")
{
//当子弹触碰到标签为"Enemy"(敌人)的时候做出处理(0.1S销毁)。可自行添加其他击中敌人逻辑。
Destroy(gameObject,0.1f);
}
}
}
以上代码可实现tag为“Enemy”(敌人,必要:包含碰撞器勾选IsTigger选项)的进入atksize(攻击范围的)的时候,Tanker的炮筒缓动指向敌人并进行攻击。
需要注意的地方是碰撞检测OnTriggerEnter触发条件:
碰撞双方都必须是碰撞体
碰撞双方其中一个碰撞体必须勾选IsTigger选项
碰撞双方其中一个必须是刚体
刚体的IsKinematic选项可以勾选也可以不勾选
只有满足上面两个条件,才会触发代码中的碰撞检测事件。
这部分仅包含炮塔和子弹部分。测试需自行创建标签为Enemy”(必要:包含碰撞器勾选IsTigger选项)的 物体。
供初学者参考。不足之处望大佬指教。