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