Пятница, 29 Марта 2024, 04:37

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Floating Origin and Edy's Vehicle Physics
Floating Origin and Edy's Vehicle Physics
SiomonLДата: Четверг, 26 Ноября 2020, 09:06 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте форумчане. У нас возникла небольшая проблема с 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 FloatingOrigin111 : 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


Сообщение отредактировал SiomonL - Пятница, 27 Ноября 2020, 00:20
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Floating Origin and Edy's Vehicle Physics
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг