【常用】查找子物体

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25601345/article/details/88548200
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
  
/// <summary>
/// 变换组件助手类
/// </summary>
public class TransformHelper
{
    /// <summary>
    /// 未知层级关系,根据名称查找后代物体。
    /// </summary>
    /// <param name="parentTF">父物体变换组件</param>
    /// <param name="childName">需要检索的子物体名称</param>
    /// <returns></returns>
    public static Transform FindChild(Transform parentTF, string childName)
    {
        //递归:将问题转移给范围缩小的同类子问题
        //作用:将复杂的问题简单化。
        //步骤:找儿子   如果没有  转移给儿子

        //1.找儿子
        Transform childTF = parentTF.Find(childName);
        //如果查找到 则返回子物体变换组件 退出方法
        if (childTF != null) return childTF;
        //2.如果没有
        for (int i = 0; i < parentTF.childCount; i++)
        {//3.转移给儿子
            childTF = FindChild(parentTF.GetChild(i), childName);
            if (childTF != null) return childTF;
        }
        return null;
        /*
         3!   阶乘  3  *  2 * 1
         */
    }

    /// <summary>
    /// 逐渐注视目标点旋转
    /// </summary>
    /// <param name="targetTF">变换组件</param>
    /// <param name="targetPos">目标点</param>
    /// <param name="rotateSpeed">旋转速度</param>
    public static void LookPostion(Transform targetTF, Vector3 targetPos, float rotateSpeed)
    {
        Vector3 dir = targetPos - targetTF.position;
        LookDirection(targetTF, dir, rotateSpeed);
    }

    /// <summary>
    /// 逐渐注视目标方向旋转
    /// </summary>
    /// <param name="targetTF">变换组件</param>
    /// <param name="targetDir">目标方向</param>
    /// <param name="rotateSpeed">旋转速度</param>
    public static void LookDirection(Transform targetTF, Vector3 targetDir, float rotateSpeed)
    {
        //如果需要注视零方向
        if (targetDir == Vector3.zero) return;
        //transform.LookAt(目标点);      一帧旋转到位
        Quaternion dir = Quaternion.LookRotation(targetDir);
        targetTF.rotation = Quaternion.Lerp(targetTF.rotation, dir, Time.deltaTime * rotateSpeed);
    }

    /// <summary>
    /// 计算周边对象
    /// </summary>
    /// <param name="currentTF">当前对象变换组件</param>
    /// <param name="distance">距离</param>
    /// <param name="angle">角度</param>
    /// <param name="targetTags">检索目标的标签</param>
    /// <returns></returns>
    public static Transform[] CalculateAroundTransform(Transform currentTF,float distance,float angle,string[] targetTags)
    {
        //1.找到所有敌人
        List<Transform> list = new List<Transform>();
        foreach (var tag in targetTags)
        {
            GameObject[] tempGos = GameObject.FindGameObjectsWithTag(tag);
            list.AddRange(ArrayHelper.Select(tempGos, o => o.transform));
        }

        //2.查找满足条件的所有敌人:攻击范围内
        list = list.FindAll(tf =>
               Vector3.Distance(tf.position, currentTF.position) <= distance &&
               Vector3.Angle(currentTF.forward, tf.position - currentTF.position) <= angle / 2
        );
        return list.ToArray();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_25601345/article/details/88548200