Floating Origin and Edy's Vehicle Physics

357
13 июля 2022, 20:40

У нас возникла небольшая проблема с Floating Origin и Edy's Vehicle Physics. Дело в том, что когда срабатывает Floating, физика Edy сильно «психует» Машину подкидывает, либо начинает крутить. Я нашла на форуме возможное решение, Код:

var v = rb.velocity;
var av = rb.angularVelocity;
rb.Sleep();
go.SetActive(false);
     
go.transform.position += offset;
     
go.SetActive(true);
rb.velocity = v;
rb.angularVelocity = av;

Но в силу того что я не сильна в программировании, то не понимаю как и куда применить кусочек кода. Я пыталась реализовать данный фрагмент кода в самом скрипте Floating Origin, но ничего не поменялось. Мои попытки решения: (только не ругайте сильно, я мало что знаю в программировании)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using VehiclePhysics;
using EdyCommonTools;
using System.ComponentModel;
using UnityEngine.Serialization;
namespace VehiclePhysics
{
    [RequireComponent(typeof(Camera))]
    [AddComponentMenu("Vehicle Physics/Vehicle Controller", -21)]
    public class FloatingOrigin : MonoBehaviour
    {
        public float threshold = 100.0f;
        public float physicsThreshold = 1000.0f; // Set to zero to disable
        private RigidBody rb;
        private GameObject go;
        
        void Awake()
        {
            var v = rb.velocity;
            var av = rb.angularVelocity;
            rb.Sleep();
            go.SetActive(false);
            go.transform.position += Offset;
            go.SetActive(true);
            rb.velocity = v;
            rb.angularVelocity = av;
        }

#if OLD_PHYSICS
    public float defaultSleepVelocity = 0.14f;
    public float defaultAngularVelocity = 0.14f;
#else
        public float defaultSleepThreshold = 0.14f;
#endif
        ParticleSystem.Particle[] parts = null;
        private UnityEngine.Object[] objects;
        private Vector3 Offset;
        void LateUpdate()
        {
            Vector3 cameraPosition = gameObject.transform.position;
            cameraPosition.y = 0f;
            if (cameraPosition.magnitude > threshold)
            {
                for (int z = 0; z < SceneManager.sceneCount; z++)
                {
                    foreach (GameObject g in SceneManager.GetSceneAt(z).GetRootGameObjects())
                    {
                        g.transform.position -= cameraPosition;
                    }
                }
                //Object[] objects = FindObjectsOfType(typeof(Transform));
                //foreach (Object o in objects)
                //{
                //    Transform t = (Transform)o;
                //    if (t.parent == null)
                //    {
                //        t.position -= cameraPosition;
                //    }
                //}
#if SUPPORT_OLD_PARTICLE_SYSTEM
            // move active particles from old Unity particle system that are active in world space
            objects = FindObjectsOfType(typeof(ParticleEmitter));
            foreach (Object o in objects)
            {
                ParticleEmitter pe = (ParticleEmitter)o;
 
                // if the particle is not in world space, the logic above should have moved them already
        if (!pe.useWorldSpace)
            continue;
 
                Particle[] emitterParticles = pe.particles;
                for(int i = 0; i < emitterParticles.Length; ++i)
                {
                    emitterParticles[i].position -= cameraPosition;
                }
                pe.particles = emitterParticles;
            }
#endif
                // new particles... very similar to old version above
                objects = FindObjectsOfType(typeof(ParticleSystem));
                foreach (UnityEngine.Object o in objects)
                {
                    ParticleSystem sys = (ParticleSystem)o;
                    if (sys.simulationSpace != ParticleSystemSimulationSpace.World)
                        continue;
                    int particlesNeeded = sys.maxParticles;
                    if (particlesNeeded <= 0)
                        continue;
                    bool wasPaused = sys.isPaused;
                    bool wasPlaying = sys.isPlaying;
                    if (!wasPaused)
                        sys.Pause();
                    // ensure a sufficiently large array in which to store the particles
                    if (parts == null || parts.Length < particlesNeeded)
                    {
                        parts = new ParticleSystem.Particle[particlesNeeded];
                    }
                    // now get the particles
                    int num = sys.GetParticles(parts);
                    for (int i = 0; i < num; i++)
                    {
                        parts[i].position -= cameraPosition;
                    }
                    sys.SetParticles(parts, num);
                    if (wasPlaying)
                        sys.Play();
                }
                if (physicsThreshold > 0f)
                {
                    float physicsThreshold2 = physicsThreshold * physicsThreshold; // simplify check on threshold
                    objects = FindObjectsOfType(typeof(Rigidbody));
                    foreach (UnityEngine.Object o in objects)
                    {
                        Rigidbody r = (Rigidbody)o;
                        if (r.gameObject.transform.position.sqrMagnitude > physicsThreshold2)
                        {
#if OLD_PHYSICS
                        r.sleepAngularVelocity = float.MaxValue;
                        r.sleepVelocity = float.MaxValue;
#else
                            r.sleepThreshold = float.MaxValue;
#endif
                        }
                        else
                        {
#if OLD_PHYSICS
                        r.sleepAngularVelocity = defaultSleepVelocity;
                        r.sleepVelocity = defaultAngularVelocity;
#else
                            r.sleepThreshold = defaultSleepThreshold;
#endif
                        }
                    }
                }
            }
        }
    }
}

Может, кто наставит меня на путь истинный, подскажет, как и куда вставить данный фрагмент кода. Для полной картины записала видео "психов" физики Edy со скриптом FloatingOrigin https://vk.com/videos603696121?z=video603696121_456239020%2Fpl_603696121_-2

Answer 1

Если по простому то поменять название метода Awake на FixedUpdate

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using VehiclePhysics;
using EdyCommonTools;
using System.ComponentModel;
using UnityEngine.Serialization;
namespace VehiclePhysics
{
    [RequireComponent(typeof(Camera))]
    [AddComponentMenu("Vehicle Physics/Vehicle Controller", -21)]
    public class FloatingOrigin : MonoBehaviour
    {
        public float threshold = 100.0f;
        public float physicsThreshold = 1000.0f; // Set to zero to disable
        private RigidBody rb;
        private GameObject go;
        
        void FixedUpdate()
        {
            var v = rb.velocity;
            var av = rb.angularVelocity;
            rb.Sleep();
            go.SetActive(false);
            go.transform.position += Offset;
            go.SetActive(true);
            rb.velocity = v;
            rb.angularVelocity = av;
        }

#if OLD_PHYSICS
    public float defaultSleepVelocity = 0.14f;
    public float defaultAngularVelocity = 0.14f;
#else
        public float defaultSleepThreshold = 0.14f;
#endif
        ParticleSystem.Particle[] parts = null;
        private UnityEngine.Object[] objects;
        private Vector3 Offset;
        void LateUpdate()
        {
            Vector3 cameraPosition = gameObject.transform.position;
            cameraPosition.y = 0f;
            if (cameraPosition.magnitude > threshold)
            {
                for (int z = 0; z < SceneManager.sceneCount; z++)
                {
                    foreach (GameObject g in SceneManager.GetSceneAt(z).GetRootGameObjects())
                    {
                        g.transform.position -= cameraPosition;
                    }
                }
                //Object[] objects = FindObjectsOfType(typeof(Transform));
                //foreach (Object o in objects)
                //{
                //    Transform t = (Transform)o;
                //    if (t.parent == null)
                //    {
                //        t.position -= cameraPosition;
                //    }
                //}
#if SUPPORT_OLD_PARTICLE_SYSTEM
            // move active particles from old Unity particle system that are active in world space
            objects = FindObjectsOfType(typeof(ParticleEmitter));
            foreach (Object o in objects)
            {
                ParticleEmitter pe = (ParticleEmitter)o;
 
                // if the particle is not in world space, the logic above should have moved them already
        if (!pe.useWorldSpace)
            continue;
 
                Particle[] emitterParticles = pe.particles;
                for(int i = 0; i < emitterParticles.Length; ++i)
                {
                    emitterParticles[i].position -= cameraPosition;
                }
                pe.particles = emitterParticles;
            }
#endif
                // new particles... very similar to old version above
                objects = FindObjectsOfType(typeof(ParticleSystem));
                foreach (UnityEngine.Object o in objects)
                {
                    ParticleSystem sys = (ParticleSystem)o;
                    if (sys.simulationSpace != ParticleSystemSimulationSpace.World)
                        continue;
                    int particlesNeeded = sys.maxParticles;
                    if (particlesNeeded <= 0)
                        continue;
                    bool wasPaused = sys.isPaused;
                    bool wasPlaying = sys.isPlaying;
                    if (!wasPaused)
                        sys.Pause();
                    // ensure a sufficiently large array in which to store the particles
                    if (parts == null || parts.Length < particlesNeeded)
                    {
                        parts = new ParticleSystem.Particle[particlesNeeded];
                    }
                    // now get the particles
                    int num = sys.GetParticles(parts);
                    for (int i = 0; i < num; i++)
                    {
                        parts[i].position -= cameraPosition;
                    }
                    sys.SetParticles(parts, num);
                    if (wasPlaying)
                        sys.Play();
                }
                if (physicsThreshold > 0f)
                {
                    float physicsThreshold2 = physicsThreshold * physicsThreshold; // simplify check on threshold
                    objects = FindObjectsOfType(typeof(Rigidbody));
                    foreach (UnityEngine.Object o in objects)
                    {
                        Rigidbody r = (Rigidbody)o;
                        if (r.gameObject.transform.position.sqrMagnitude > physicsThreshold2)
                        {
#if OLD_PHYSICS
                        r.sleepAngularVelocity = float.MaxValue;
                        r.sleepVelocity = float.MaxValue;
#else
                            r.sleepThreshold = float.MaxValue;
#endif
                        }
                        else
                        {
#if OLD_PHYSICS
                        r.sleepAngularVelocity = defaultSleepVelocity;
                        r.sleepVelocity = defaultAngularVelocity;
#else
                            r.sleepThreshold = defaultSleepThreshold;
#endif
                        }
                    }
                }
            }
        }
    }
}
READ ALSO
Стартовая позиция полосы прокрутки в panel

Стартовая позиция полосы прокрутки в panel

Имеется панель на которой размещены элементыС помощью кода ниже удалось добавить вертикальную полосу прокрутки (выглядит то оно так, но мы все...

295
Как получить из Scroll View доступ к ComboBoxEdit C# WPF

Как получить из Scroll View доступ к ComboBoxEdit C# WPF

как получить из Scroll View доступ к ComboBoxEdit C# WPF Использую для ленивой подгрузки

344
Тестовый сервер для сайта

Тестовый сервер для сайта

Всем приветНужно использовать "временный" сервер для одного сайта и для одного пользователя

268
Автоматическое создание полей из параметров конструктора с проверкой

Автоматическое создание полей из параметров конструктора с проверкой

В Visual Studio можно объявить конструктор класса и задать в нем все необходимые параметры, а потом нажать CTRL+и создать приватное поле, которое...

225