C# 在人物面前攻击敌人

C# 在人物面前攻击敌人,c#,unity3d,collision-detection,unity5,raycasting,C#,Unity3d,Collision Detection,Unity5,Raycasting,我有自动攻击系统,可以攻击射程内的敌人。问题是我不想攻击我身后的敌人,而只想攻击前面的敌人,所以我使用了物理。光线投射,当我的对撞机触发器中有1个敌人时,它工作正常,但当有更多敌人时(假设有2个),一个敌人在后面,一个在前面,首先我检查光线投射,它返回真值,但由于我身后的敌人先进入对撞机,我的法术就在对撞机所在的位置施放。那个么我怎样才能对我面前的物体施法(获得位置) 以下是我施法的代码: public void castSpell(GameObject caster, GameObject o

我有自动攻击系统,可以攻击射程内的敌人。问题是我不想攻击我身后的敌人,而只想攻击前面的敌人,所以我使用了
物理。光线投射
,当我的对撞机触发器中有1个敌人时,它工作正常,但当有更多敌人时(假设有2个),一个敌人在后面,一个在前面,首先我检查光线投射,它返回真值,但由于我身后的敌人先进入对撞机,我的法术就在对撞机所在的位置施放。那个么我怎样才能对我面前的物体施法(获得位置)

以下是我施法的代码:

public void castSpell(GameObject caster, GameObject other, float duration)
{
    var fwd = transform.TransformDirection(Vector3.forward);
    if(castOnlyForward && !Physics.Raycast(transform.position, fwd, 10))
    {
        return;
    }
    Debug.Log("ON");    
    if(animationEnabled)
    {
        foreach(var a in animator)
        {
            foreach(var b in a.bools)
            {
                a.animator.SetBool(b.parameterName, b.parameterValue);
            }
            foreach(var i in a.ints)
            {
                a.animator.SetInteger(i.parameterName, i.parameterValue);
            }
            foreach(var f in a.floats)
            {
                a.animator.SetFloat(f.parameterName, f.parameterValue);
            }
        }
    }

    GameObject Temporary_Spell_Handler;
    Temporary_Spell_Handler = Instantiate(_Spell, Spell_Emitter.transform.position, Spell_Emitter.transform.rotation) as GameObject;


    //Add Spell Script to the casted spell so it handes damage and everything about spells.
    Spell tempSpell = Temporary_Spell_Handler.GetComponent<Spell>();
    tempSpell.caster = caster;

    if(b_lenghtScale)
    {
        float percent = currentDistance / (maxDistance / 100);
        ParticleSystemRenderer pr = Temporary_Spell_Handler.GetComponent<ParticleSystemRenderer>();
        pr.lengthScale = -(((lenghtScale - Math.Abs(pr.lengthScale)) / 100) * percent);
        Vector3 newScale = new Vector3();
        newScale.x = (maxScale.x / 100) * percent;
        newScale.y = (maxScale.y / 100) * percent;
        newScale.z = (maxScale.z / 100) * percent;

        Temporary_Spell_Handler.transform.localScale = newScale;
    }

    if(lookAtEnemy)
    {
        if(other.transform.parent != null && other.transform.parent.gameObject.tag == "pivotChange")
        {
            Temporary_Spell_Handler.transform.LookAt(other.transform.parent.gameObject.transform);
        }
        else
        {
            Temporary_Spell_Handler.transform.LookAt(other.transform);
        }
    }

    Destroy(Temporary_Spell_Handler, duration);
}

如果您还需要什么,请告诉我。

分析:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
如果内部有多个碰撞器,则每帧多次调用OnTiggerStay

然后,您的代码启动两个调用

castSpell(caster, ...
因此,由于施法者在两种情况下都是相同的,第二个协同进程调用可能会覆盖第一个,因此总是对其中一个施法,而不是两个施法

我的建议:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
你伪造了一些视野系统。在开始协同程序之前,检查连接玩家和敌人位置的骰子向量from
player.transform.forward
。也就是说,仅仅是区别:
player.transform.position-敌人.transform.position
-或者在你的情况下,
collider.transform.position
代表敌人

您可能需要在减法中切换操作数,现在无法测试

来自我大脑的代码:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
float angle=Vector3.angle(player.transform.forward,player.transform.position-collider.transform.position);
Log(“角度为:”+角度);
如果(角度>-45和角度<45){
//在这里开始你的施法合作
}

确保测试时阅读控制台,我不是100%确定角度值将如何出来。尤其是在0左右。

分析:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
如果内部有多个碰撞器,则每帧多次调用OnTiggerStay

然后,您的代码启动两个调用

castSpell(caster, ...
因此,由于施法者在两种情况下都是相同的,第二个协同进程调用可能会覆盖第一个,因此总是对其中一个施法,而不是两个施法

我的建议:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
你伪造了一些视野系统。在开始协同程序之前,检查连接玩家和敌人位置的骰子向量from
player.transform.forward
。也就是说,仅仅是区别:
player.transform.position-敌人.transform.position
-或者在你的情况下,
collider.transform.position
代表敌人

您可能需要在减法中切换操作数,现在无法测试

来自我大脑的代码:

float angle = Vector3.Angle(player.transform.forward, player.transform.positon - collider.transform.position);
Debug.Log("the angle is: " + angle);
if(angle > -45 && angle < 45){
    // start your spell casting coroutine here
}
float angle=Vector3.angle(player.transform.forward,player.transform.position-collider.transform.position);
Log(“角度为:”+角度);
如果(角度>-45和角度<45){
//在这里开始你的施法合作
}

确保测试时阅读控制台,我不是100%确定角度值将如何出来。特别是在0左右。

您需要做的是计算所解释的点积。这是一个更为坚实的解决方案,而不是使用可能导致奇怪行为的角度。

您需要做的是计算所解释的点积。这是一种更为坚实的解决方案,而不是使用可能导致奇怪行为的角度。

它正在工作。提到你(编辑答案),我需要输入的唯一角度是
angle>90
,因为在文档中它说
返回的角度始终是两个向量之间的非反射角度-即它们之间的两个可能角度中较小的一个,并且永远不会大于180度。
它正在工作。提到你(编辑答案),我需要输入的唯一角度是
angle>90
,因为在文档中它说
返回的角度总是两个向量之间的非反射角度-即它们之间的两个可能角度中较小的一个,并且永远不会超过180度。
如果你共享代码,我可以提供帮助。如果使用此处提到的其他方法,您可能会遇到其他问题。您尝试计算点积以确定是否有东西在您后面/前面。如果您共享代码,我可以提供帮助。如果使用此处提到的其他方法,您可能会遇到其他问题,您试图计算点积以确定是否有东西在您后面/前面