[Unity基础]arpg中的攻击判定

总结一下,大致有三种:

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("我已经锁定你了!");
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值