unity3d 设置是否在攻击范围

using UnityEngine;
using System.Collections;

public class Vector3Practice : MonoBehaviour
{
    public Transform Target;

    public bool onlyOne = true;

    public Transform enemy;

    // Use this for initialization
    void Start ()
    {
    
    }
    
    // Update is called once per frame
    void Update ()
    {
        setArea1 (Target);
    }
        
    //沿着obj的X轴延伸10米后的坐标
    public void SetXPosition1 (Transform objTran, float distance)
    {
        objTran.Translate (new Vector3 (distance, 0f, 0f), Space.Self);
    }

    //获取沿着obj的正前方延伸distance后的坐标
    public Vector3 GetPosition1 (Transform objTran, float distance)
    {
        return Target.position + (Target.rotation * Vector3.forward) * distance;
    }

    //沿着世界坐标的X轴延伸10米后的坐标
    public void SetPosition2 (Transform objTran)
    {
        objTran.Translate (new Vector3 (10f, 0f, 0f), Space.World);
    }

    //沿着物体的Y轴旋转30°
    public void SetRotation1 (Transform objTran)
    {
        objTran.rotation = Quaternion.Euler (0f, 30f, 0f) * objTran.rotation;
    }

    //向着目标点移动 Vector3.forward是一个标准向量(0,0,1)
    public void forward (Transform resource, Vector3 target)
    {
        resource.LookAt (target);
        resource.Translate (Vector3.forward * 100);
    }


    //主角看到的是向左30度,向右30度,的区域前方
    public void setArea1 (Transform hero)
    {
        #region 目标点 到 目标点正前方5单位
        Vector3 v0 = hero.position + hero.rotation * Vector3.forward * 5f;
        Debug.DrawLine (hero.position, v0, Color.red);
        #endregion


        #region  目标点 到 目标绕Y轴旋转30°再延伸5单位
        Quaternion q1 = Quaternion.Euler (0f, 30f, 0) * hero.rotation;
        Vector3 v1 = hero.position + q1 * Vector3.forward * 5;
        Debug.DrawLine (hero.position, v1, Color.red);
        #endregion


        #region 目标点 到 目标绕Y轴旋转-30°再延伸5单位
        Quaternion q2 = Quaternion.Euler (0f, -30f, 0) * hero.rotation;
        Vector3 v2 = hero.position + q2 * Vector3.forward * 5;
        Debug.DrawLine (hero.position, v2, Color.red);
        #endregion

        //方便查看 将目标点前面的三个点连起来
        Debug.DrawLine (v0, v1, Color.red);
        Debug.DrawLine (v0, v2, Color.red);

        if (isInArea (enemy.position, Target.position, v0, v1) || isInArea (enemy.position, transform.position, v0, v2)) {  
            Debug.Log ("enemy in this !!!");  
        } else {  
            Debug.Log ("enemy not in this !!!");  
        }  
    }

    //如果某点M在三角形ABC中,那么 MAB MAC MBC 的面积之和=三角形ABC的面积,
    //如果MAB MAC MBC的面积之和大于三角形ABC的面积,那么M就在三角形ABC的外面。
    public bool isInArea (Vector3 point, Vector3 v0, Vector3 v1, Vector3 v2)
    {
        float x = point.x;  
        float y = point.z;  

        float v0x = v0.x;  
        float v0y = v0.z;  

        float v1x = v1.x;  
        float v1y = v1.z;  

        float v2x = v2.x;  
        float v2y = v2.z;  

        float t = triangleArea (v0x, v0y, v1x, v1y, v2x, v2y);  
        float a = triangleArea (v0x, v0y, v1x, v1y, x, y) + triangleArea (v0x, v0y, x, y, v2x, v2y) + triangleArea (x, y, v1x, v1y, v2x, v2y);  

        if (Mathf.Abs (t - a) <= 0.01f) {  
            return true;  
        } else {  
            return false;  
        }  
    }

    //假设三角形的三个顶点为(a,b)(c,d)(e,f)
    //那么三角形的面积S△=|ad+be+cf-ed-af-bc|/2
    public float triangleArea (float v0x, float v0y, float v1x, float v1y, float v2x, float v2y)
    {
        return Mathf.Abs ((v0x * v1y + v1x * v2y + v2x * v0y - v1x * v0y - v2x * v1y - v0x * v2y) / 2f);  
    }
}

运行效果:




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值