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);
}
}
运行效果: