缓动瞄准射击的坦克——最白话,手把手教你做系列。

直奔主题,缓动瞄准射击的坦克。首先,需求的几个要素。
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选项)的 物体。
供初学者参考。不足之处望大佬指教。

发布了27 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39860954/article/details/78754223