Сделать начало координат с плавающей запятой в единствеC#

Место общения программистов C#
Ответить
Anonymous
 Сделать начало координат с плавающей запятой в единстве

Сообщение Anonymous »

Я создал этот код в Unity, чтобы перемещать объект в моей сцене только в случае превышения порогового значения, но он не устанавливает мой объект отслеживания и продолжает привязываться к нему. Моим объектом слежения было твердое тело, и к нему использовались Interpolate и Continuous. Может ли кто-нибудь помочь мне понять, почему он не остается на месте? Я перепробовал все
`

Код: Выделить всё

Using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FloatingOrigin: MonoBehaviour
{
private enum MoveingScene { Idele, IsMoving, StopMoving };
[SerializeField] private List objects = new List();
[Header("Debug")]
[SerializeField] private MoveingScene movingScene = MoveingScene.Idele;
private GameObject player;
[SerializeField] private float threshold = 100.0f;
[SerializeField] CarController activeCarController;
[SerializeField] GameObject trackingObject;
[SerializeField] private bool isTrackingCar = false;
[SerializeField] private Vector3 currentTrackingPosition;

private void Start()
{
// Find player at start
player = GameObject.FindGameObjectWithTag("Player");
}

private void Update()
{
Vector3 originPosition = GetTrackingPosition();
originPosition.y = 0f; // Keep Y at 0 for floating origin
currentTrackingPosition = originPosition;

if (player == null)
{
player = GameObject.FindGameObjectWithTag("Player");
if (player == null) return;
}

if (movingScene == MoveingScene.Idele && originPosition.magnitude > threshold)
{
ApplyFloatingOriginOffset(originPosition);
}
else if (movingScene == MoveingScene.StopMoving)
{
movingScene = MoveingScene.Idele;
}
}

private Vector3 GetTrackingPosition()
{
if (activeCarController != null && activeCarController.PlayerInCar())
{
// Player is in a car, track the car's position
isTrackingCar = activeCarController.PlayerInCar();
trackingObject = activeCarController.gameObject;
return activeCarController.transform.position;
}
else
{
// Player is not in a car, track player's position
isTrackingCar = false;
trackingObject = player;
return player. transform.p osition;
}
}

private void ApplyFloatingOriginOffset(Vector3 offset)
{
if (movingScene != MoveingScene.Idele)
return;

movingScene = MoveingScene.IsMoving;

// --- Disable physics while we shift ---
if (trackingObject != null)
{
var rb = trackingObject.GetComponent();
if (rb != null) rb.isKinematic = true;
}

// --- Shift all objects ---
foreach (GameObject obj in objects)a
if (obj == null) continue;
obj. transform.position -= offset;
}

// --- Also shift any dynamically tracked objects not in the list ---
if (trackingObject != null && !objects.Contains(trackingObject))
{
trackingObject.transform.position -= offset;
}

// --- Re-enable physics ---
if (trackingObject != null)
{
var rb = trackingObject.GetComponent();
if (rb != null) rb.isKinematic = false;
}

// --- Reset the tracking origin ---
currentTrackingPosition = Vector3.zero;

movingScene = MoveingScene.StopMoving;
}

// Debug visualization
private void OnDrawGizmos()
{
if (!Application.isPlaying) return;

// Draw threshold sphere
Gizmos.color = new Color(1, 1, 0, 0.1f);
Gizmos.DrawWireSphere(Vector3.zero, threshold);

// Draw current tracking position
if (currentTrackingPosition != Vector3.zero)
{
Gizmos.color = isTrackingCar? Color.red: Color. green;
Gizmos.DrawWireSphere(currentTrackingPosition, 2f);
Gizmos.DrawLine(Vector3.zero, currentTrackingPosition);

// Draw distance text (requires Handles in editor)
}
}
}
`

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-in-unity
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»