Во-первых, Camera.main
вызывает FindGameObjectsWithTag
, что является дорогостоящей операцией, поэтому (, как сказано в документации ), вам следует вызывать ее как можно меньше раз и кэшировать результат:
Camera mainCam;
void Awake()
{
mainCam = Camera.main;
}
Во-вторых, вы используете ScreenToWorldPoint
неправильно. Если это действительно трехмерная игра, как описывает вопрос, вы должны предоставить глубину от камеры в качестве z-компонента аргумента. Вы можете использовать векторную математику, чтобы сделать это, и в результате вы получите мировую позицию, в которой вы можете поставить курсор в точке .:
Camera mainCam;
void Awake()
{
mainCam = Camera.main;
}
void Update()
{
float objectDepthFromCamera = Vector3.Dot(
transform.position - mainCam.transform.position,
mainCam.transform.forward);
Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition
+ Vector3.forward * objectDepthFromCamera);
Тогда предположим, что «фронт» объекта направлен наружу. направление, вы можете использовать необязательный второй параметр Quaternion.SetRotation
, чтобы установить вращение, указывающее на курсор:
Camera mainCam;
void Awake()
{
mainCam = Camera.main;
}
void Update()
{
float objectDepthFromCamera = Vector3.Dot(
transform.position - mainCam.transform.position,
mainCam.transform.forward);
Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition
+ Vector3.forward * objectDepthFromCamera);
transform.rotation = Quaternion.LookRotation(Vector3.forward,
cursorWorldPosition - transform.position);
}
Если передняя часть объекта указывает на локальное правильное направление, вы можете использовать Vector3.Cross
, чтобы определить, в каком направлении должен указывать локальный верх:
Camera mainCam;
void Awake()
{
mainCam = Camera.main;
}
void Update()
{
float objectDepthFromCamera = Vector3.Dot(
transform.position - mainCam.transform.position,
mainCam.transform.forward);
Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition
+ Vector3.forward * objectDepthFromCamera);
Vector3 localUpNeeded = Vector3.Cross(Vector3.forward,
cursorWorldPosition - transform.position);
transform.rotation = Quaternion.LookRotation(Vector3.forward, localUpNeeded);
}