Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 厄运般的角度改变精灵_C#_Rotation_Unity3d - Fatal编程技术网

C# 厄运般的角度改变精灵

C# 厄运般的角度改变精灵,c#,rotation,unity3d,C#,Rotation,Unity3d,所以,我正在尝试制作一个第一人称游戏,它使用了与厄运、杜克核弹等游戏相同的精灵机制 到目前为止,我可以确定我所处的角度与静态物体有关,但与旋转物体无关。我有一些“敌人”会改变旋转并开始跟随我,但计算切线角(Mathf.Atan2)时不会考虑敌人的旋转 以下是我目前使用的代码,它非常适用于不旋转的对象: int GetAngleIndex() { var dir = cam.transform.position - transform.parent.forward; var e

所以,我正在尝试制作一个第一人称游戏,它使用了与厄运、杜克核弹等游戏相同的精灵机制

到目前为止,我可以确定我所处的角度与静态物体有关,但与旋转物体无关。我有一些“敌人”会改变旋转并开始跟随我,但计算切线角(Mathf.Atan2)时不会考虑敌人的旋转

以下是我目前使用的代码,它非常适用于不旋转的对象:

 int GetAngleIndex()
 {
    var dir = cam.transform.position - transform.parent.forward;
    var enemyAngle = Mathf.Atan2(dir.z, dir.x) * Mathf.Rad2Deg;

    if (enemyAngle < 0.0f)
        enemyAngle += 360;

    Debug.Log("Angle from the player is: " + enemyAngle);

    if (enemyAngle >= 292.5f && enemyAngle < 337.5f)
        return 8;
    else if (enemyAngle >= 22.5f && enemyAngle < 67.5f)
        return 2;
    else if (enemyAngle >= 67.5f && enemyAngle < 112.5f)
        return 3;
    else if (enemyAngle >= 112.5f && enemyAngle < 157.5f)
        return 4;
    else if (enemyAngle >= 157.5f && enemyAngle < 202.5f)
        return 5;
    else if (enemyAngle >= 202.5f && enemyAngle < 247.5f)
        return 6;
    else if (enemyAngle >= 247.5f && enemyAngle < 292.5f)
        return 7;
    else if (enemyAngle >= 337.5f || enemyAngle < 22.5f)
        return 1;
    else return 0;
}
int GetAngleIndex()
{
var dir=cam.transform.position-transform.parent.forward;
var enemyAngle=Mathf.Atan2(dir.z,dir.x)*Mathf.Rad2Deg;
如果(灌肠角度<0.0f)
灌肠角度+=360;
Log(“与播放器的角度为:“+enemyAngle”);
如果(灌肠角度>=292.5f&&灌肠角度<337.5f)
返回8;
否则,如果(灌肠角度>=22.5f&&灌肠角度<67.5f)
返回2;
否则如果(灌肠角度>=67.5f&&灌肠角度<112.5f)
返回3;
否则如果(灌肠角度>=112.5f&&灌肠角度<157.5f)
返回4;
否则如果(灌肠角度>=157.5f&&灌肠角度<202.5f)
返回5;
否则如果(灌肠角度>=202.5f&&灌肠角度<247.5f)
返回6;
否则如果(灌肠角度>=247.5f&&灌肠角度<292.5f)
返回7;
否则如果(灌肠角度>=337.5f | |灌肠角度<22.5f)
返回1;
否则返回0;
}

我已经搜索了几个小时,但我找不到解决方案:(

也许我不了解您试图在这里创建的确切效果(如果是,请在您的帖子中提供更多信息,如屏幕截图),但您应该能够简单地使用。这些通常称为广告牌精灵

例如:

Transform.LookAt(Camera.main.transform.position, Vector3.up)

我想你提到的是广告牌的概念

下面是unity wiki中创建始终面向摄影机的广告牌的示例,请继续尝试


你说你的[唯一]问题是它没有考虑到它们的旋转-我猜这意味着你在给精灵贴广告时没有遇到问题,而且当它们朝前时,你的旋转就起作用了。为此:

矢量a和b的点积等于cos(θ)*幅值(a)*幅值(b)。因此,如果a是从相机到物体的矢量:

b是物体的前进方向:

我们知道a和b都有1级

然后我们知道这等于cos(θ),其中θ是它们之间的角度。

然而,θ是最短的必要角度,因此它将从0到180。考虑到上面的开关表,我们知道当我们希望绕错方向时,我们将处于错误的位置。因此,要解决这个问题:

if(a.x*a.z<0)
θ=360.0f-θ;
然后我们只需将其插入即可。以下是我项目中的完整文件:

使用UnityEngine;
公共类spriteAngler:单一行为
{
向公众转化;
公共精神病患者;
公共精灵[]mySprites;
私有浮动θ;
私人向量3 a;
无效更新()
{
toManipulate.sprite=mySprites[GetAngleIndex()];
}
int GetAngleIndex()
{
a=toFace.position-transform.position;
a、 规范化();
var b=变换向前;
θ=Mathf.Acos(向量3.Dot(a,b))*Mathf.Rad2Deg;
如果(a.x*a.z<0)
θ=360.0f-θ;
如果(θ>=292.5f&&θ<337.5f)
返回7;
否则如果(θ>=22.5f和θ<67.5f)
返回1;
否则如果(θ>=67.5f&&θ<112.5f)
返回2;
否则如果(θ>=112.5f&&θ<157.5f)
返回3;
否则如果(θ>=157.5f&&θ<202.5f)
返回4;
否则如果(θ>=202.5f&&θ<247.5f)
返回5;
否则如果(θ>=247.5f&&θ<292.5f)
返回6;
否则如果(θ>=337.5f | |θ<22.5f)
返回0;
否则返回0;
}
private Rect guiPos=new Rect(0,0,720,30);
void OnGUI()
{
GUI.Label(guiPos,“与播放器的角度为:“+theta+”和forward=“+transform.forward+”和vectorToTarget=“+a”);
}
}
如果这需要更多的背景,下面是我的项目:

我建议玩游戏,但要看场景窗口而不是游戏窗口

var a = cam.transform.position - transform.parent.position
var b = transform.parent.forward
a.Normalize();
//b is already normalized
var theta = Mathf.Acos(Vector3.Dot(a, b)) * Mathf.Rad2Deg;
if (a.x * a.z < 0)
    theta = 360.0f - theta;
using UnityEngine;

public class spriteAngler : MonoBehaviour
{
    public Transform toFace;
    public SpriteRenderer toManipulate;
    public Sprite[] mySprites;
    private float theta;
    private Vector3 a;
    void Update()
    {
        toManipulate.sprite = mySprites[GetAngleIndex()];
    }
    int GetAngleIndex()
    {
        a = toFace.position - transform.position;

        a.Normalize();
        var b = transform.forward;

        theta = Mathf.Acos(Vector3.Dot(a, b)) * Mathf.Rad2Deg;

        if (a.x * a.z < 0)
            theta = 360.0f - theta;

        if (theta >= 292.5f && theta < 337.5f)
            return 7;
        else if (theta >= 22.5f && theta < 67.5f)
            return 1;
        else if (theta >= 67.5f && theta < 112.5f)
            return 2;
        else if (theta >= 112.5f && theta < 157.5f)
            return 3;
        else if (theta >= 157.5f && theta < 202.5f)
            return 4;
        else if (theta >= 202.5f && theta < 247.5f)
            return 5;
        else if (theta >= 247.5f && theta < 292.5f)
            return 6;
        else if (theta >= 337.5f || theta < 22.5f)
            return 0;
        else return 0;
    }

    private Rect guiPos = new Rect(0, 0, 720, 30);
    void OnGUI()
    {
        GUI.Label(guiPos, "Angle from the Player is: " + theta + " and forward=" + transform.forward + " and vectorToTarget=" + a);
    }
}