总结一下,大致有三种:
1.角度 + 距离
2.碰撞器(略)
3.Physics类(略)
如果是在播放攻击动画时进行判定,还可以使用动画事件
先说一下向量相关的:
using UnityEngine;
using System.Collections;
//在原点创建一个Cube,并挂上这个脚本
public class TestMath : MonoBehaviour {
public float angle = 45;
GameObject cube;
void Start()
{
cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
}
void Update ()
{
//1
//DrawRay(transform.position, transform.forward);
//2 将向量旋转
//DrawRay(transform.position, Quaternion.Euler(angle, 0, 0) * transform.forward);//绕x轴
//3
//DrawRay(transform.position, Quaternion.Euler(0, angle, 0) * transform.forward);//绕y轴
//4 在向量上的投影
//Vector3 a = Vector3.Project(Quaternion.Euler(angle, 0, 0) * transform.forward, transform.up);
//DrawRay(transform.position, a);
//5 在平面上的投影,第二个参数是平面的法线
Vector3 a = Vector3.ProjectOnPlane(Quaternion.Euler(angle, 0, 0) * transform.forward, transform.forward);
DrawRay(transform.position, a);
}
void DrawRay(Vector3 start, Vector3 dir)
{
Debug.DrawRay(start, dir);
cube.transform.localPosition = start + dir;
}
}
using UnityEngine;
using System.Collections;
public class TestRot : MonoBehaviour {
public Transform target;
void Start()
{
//四元数rotation的一些运算
Quaternion rotation = target.rotation * Quaternion.Euler(0f, 30f, 0f);//当前角度绕y轴旋转30度
Vector3 pos = rotation * new Vector3(10f, 0f, 0f);//当前角度沿x轴前进10个单位
Debug.DrawLine(pos, Vector3.zero, Color.red);
Debug.Log("newpos " + pos + " nowpos " + target.position + " distance " + Vector3.Distance(pos, target.position));
//向量旋转
//当前向量绕y轴旋转45度,也可认为现将角度绕y轴旋转45度,在沿z轴前进1个单位
Vector3 a = Quaternion.Euler(0f, 45f, 0f) * Vector3.forward;//只旋转,向量的长度是不变的
Debug.Log(a);
}
}
角度 + 距离:
using UnityEngine;
using System.Collections;
public class TestRot2 : MonoBehaviour {
public Transform target;
public float angle = 60f;
public float distance = 5f;
void Update()
{
Vector3 direction = target.position - transform.position;
if (Vector3.Angle(direction, transform.forward) < angle)
if (Vector3.Distance(target.position, transform.position) < distance)
print("我已经锁定你了!");
}
}