示例#1
0
    private void UpdateNearbySourceIntersections(GravitySource gravitySource)
    {
        if (gravitySource != currentGravitySource)
        {
            // Gravity source changed. Re-initialize source intersections
            currentGravitySource = gravitySource;
            InitializeSourceIntersections();
            return;
        }
        // Update source intersection entries
        for (int i = 0; i < sourceIntersections.Count; i++)
        {
            SourceIntersections thisSourceIntersectionEntry = sourceIntersections[i];

            // Hide all intersection sprites
            thisSourceIntersectionEntry.HideIntersectionObjects();
            // Stop coroutines running for each existing segment intersection
            for (int j = 0; j < thisSourceIntersectionEntry.IntersectionCount; j++)
            {
                IEnumerator thisRoutine = thisSourceIntersectionEntry.intersectionCoroutines[j];
                if (thisRoutine == null)
                {
                    continue;
                }
                StopCoroutine(thisRoutine);
            }
            // Update this entry with now valid intersection objects
            SegmentIntersection[] validIntersections = GetValidSegmentIntersections(thisSourceIntersectionEntry.Source);
            thisSourceIntersectionEntry.UpdateSegmentIntersections(validIntersections);
        }
    }
示例#2
0
    public override void OnInspectorGUI()
    {
        GravitySource source = (GravitySource)target;

        source.type            = (GravitySource.Type)EditorGUILayout.EnumPopup("Type", source.type);
        source.gravityStrength = EditorGUILayout.FloatField("Gravity strength", source.gravityStrength);
    }
示例#3
0
 public void ResetGravity()
 {
     //gravitySource = GalaxyManager.Galaxy;
     gravitySource = null;
     isFloating    = true;
     Float();
 }
示例#4
0
    void Start()
    {
        SceneData data = GameObject.FindObjectOfType <SceneData>();

        planet     = data.planet;
        srcGravity = planet.gravity;
    }
示例#5
0
 public void ResetGravity()
 {
     //gravitySource = GalaxyManager.Galaxy;
     transform.parent = transform.parent.parent;
     gravitySource    = null;
     isFloating       = true;
     //Float();
 }
示例#6
0
        public static Vector2 GravitationalForceAtPosition(this GravitySource gravitySource, Vector2 position, float mass)
        {
            Vector2 distance       = gravitySource.Position - position;
            float   forceMagnitude = Globals.GRAVITATIONALCONSTANT * gravitySource.Mass * mass / Vector2.SqrMagnitude(distance);
            Vector2 force          = forceMagnitude * distance.normalized;

            return(force);
        }
示例#7
0
 public static void Unregister(GravitySource source)
 {
     if (!sources.Contains(source))
     {
         return;
     }
     sources.Remove(source);
 }
示例#8
0
 public static void Register(GravitySource source)
 {
     if (sources.Contains(source))
     {
         return;
     }
     sources.Add(source);
 }
 public static void Register(GravitySource source)
 {
     Debug.Assert(
         !sources.Contains(source),
         "Duplicate registration of gravity source!", source
         );
     sources.Add(source);
 }
 public static void Unregister(GravitySource source)
 {
     Debug.Assert(
         sources.Contains(source),
         "Unregistration of unknown gravity source!", source
         );
     sources.Remove(source);
 }
示例#11
0
    // Update is called once per frame
    void Update()
    {
        GravitySource source = gravityObject.GetGravitySource();
        Vector3       target = source != null
            ? new Vector3(source.transform.position.x, source.transform.position.y, transform.position.z)
            : new Vector3(player.transform.position.x, player.transform.position.y, transform.position.z);

        transform.position = Vector3.Lerp(transform.position, target, 0.3f);
    }
 /// <summary>
 /// 注册重力源
 /// </summary>
 /// <param name="source">重力源</param>
 public static void Register(GravitySource source)
 {
     // 1. 检查是否已存在
     Debug.Assert(!m_sources.Contains(source),
                  "Duplicate registration of gravity source!", source
                  );
     // 2. 添加
     m_sources.Add(source);
 }
 /// <summary>
 /// 删除重力源
 /// </summary>
 /// <param name="source">重力源</param>
 public static void Unregister(GravitySource source)
 {
     // 1. 检查重力源是否不存在,是则报错
     Debug.Assert(m_sources.Contains(source),
                  "Unrestration of unkonwn gravity source", source
                  );
     // 2. 移除
     m_sources.Remove(source);
 }
示例#14
0
 public static void RegisterGravitySource(GravitySource source)
 {
     Debug.Assert(
         !sources.Contains(source),
         "Trying to add a gravity source already registered.",
         source
         );
     sources.Add(source);
 }
示例#15
0
 public static void UnregisterGravitySource(GravitySource source)
 {
     Debug.Assert(
         sources.Contains(source),
         "Trying to remove a gravity source that was not registered.",
         source
         );
     sources.Remove(source);
 }
示例#16
0
 private void InitializeSourceIntersections()
 {
     ResetNearestSourceIntersections();
     for (int i = 0; i < currentGravitySource.OrbitalBodies.Count; i++)
     {
         GravitySource         source             = currentGravitySource.OrbitalBodies[i];
         SegmentIntersection[] validIntersections = GetValidSegmentIntersections(source);
         sourceIntersections.Add(new SourceIntersections(validIntersections, source, intersectionObjectPrefab));
     }
 }
示例#17
0
    private void Start()
    {
        Cursor.visible = false;
        loadingScreen  = LoadingScreen.instance;
        gravitySource  = GravitySource.instance;
        terrainPlacer  = TerrainPlacer.instance;
        player         = Player.instance;

        StartCoroutine(GenerateNewPlanet());
    }
示例#18
0
    //public void GetCurrentOffset(){
    //    currentAngle = gravitySource != null ? (transform.position.x - gravitySource.transform.position.x) / (transform.position.y - gravitySource.transform.position.y) : 0f;
    //}

    //public void SetCurrentOffset(){
    //    if (gravitySource != null){
    //        float z = transform.position.z;
    //        Vector2 pos = new Vector2(currentAngle, 1f).normalized * (gravitySource.Radius);
    //        transform.position = new Vector3(gravitySource.transform.position.x + pos.x, gravitySource.transform.position.y + pos.y, transform.position.z);
    //    }
    //}

    //public void SyncPos(){
    //    currentAngle = (transform.position.x - gravitySource.transform.position.x) / (transform.position.y - gravitySource.transform.position.y);
    //}

    public void UseGravity(GravitySource source)
    {
        if (source != null)
        {
            gravitySource    = source;
            transform.parent = source.transform.parent;
            //Float();
            isFloating = false;
        }
    }
示例#19
0
 public static void Draw(SpriteBatch sb)
 {
     if (dispGui)
     {
         GravitySource src = ModContent.GetInstance <GravitySource>();
         if (Main.player[Main.myPlayer].GetModPlayer <PlayerFixer>().custGravity)
         {
             src.DrawGUIComps(sb);
             Main.player[Main.myPlayer].GetModPlayer <PlayerFixer>().DrawGravGui(sb);
         }
     }
 }
示例#20
0
文件: Planet.cs 项目: santanor/Orbis
        void OnTriggerExit2D(Collider2D coll)
        {
            GravitySource source = coll.gameObject.GetComponent <GravitySource>();

            if (source != null)
            {
                if (source != null)
                {
                    source.OnGravityPulse -= OnGravitationalPulseForceApplied;
                }
            }
        }
示例#21
0
    private void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("Multiple instances of " + this + " found");
        }

        instance = this;

        gravityBodies = new List <GravityBody>();
        Orbision.AddOrigin(transform.position);
    }
示例#22
0
 public void UpdateSystem()
 {
     UpdateDeterministically();
     for (int i = 0; i < OrbitalBodies.Count; i++)
     {
         GravitySource gravitySource = OrbitalBodies[i];
         if (gravitySource == null || !gravitySource.isActiveAndEnabled)
         {
             continue;
         }
         gravitySource.UpdateSystem();
     }
 }
示例#23
0
    protected void InitializeNewOrbit(GravitySource newSource)
    {
        Vector2 relVel = Velocity - newSource.Velocity; // world vel - newSource.vel
        Vector2 relPos = Position - newSource.Position; // world pos - newSource.pos

        CurrentGravitySource = newSource;
        CalculateOrbitalParametersFromStateVectors(relPos, relVel);
        recentlyChangedSource = true;

        GravitySourceChangedEvent(); // invoke event
        IEnumerator recentSourceChangeCoroutine = ChangeSourceTimer();

        StartCoroutine(recentSourceChangeCoroutine);
    }
示例#24
0
        public SourceIntersections(SegmentIntersection[] segmentIntersections, GravitySource source, GameObject intersectionObjectPrefab)
        {
            SegmentIntersections   = segmentIntersections;
            IntersectionCount      = segmentIntersections.Length;
            intersectionCoroutines = new IEnumerator[IntersectionCount];
            Source = source;

            baseIntersectionSprites   = new GameObject[2];
            targetIntersectionSprites = new GameObject[2];
            for (int i = 0; i < baseIntersectionSprites.Length; i++)
            {
                AddIntersectionObject(i, baseIntersectionSprites, intersectionObjectPrefab);
                AddIntersectionObject(i, targetIntersectionSprites, intersectionObjectPrefab);
            }
        }
示例#25
0
 public void InitializeSystem(GravitySource parent)
 {
     CurrentGravitySource = parent;
     if (parent == null)
     {
         SourceRank = 0;
     }
     else
     {
         SourceRank = CurrentGravitySource.SourceRank + 1;
     }
     for (int i = 0; i < OrbitalBodies.Count; i++)
     {
         OrbitalBodies[i].InitializeSystem(this);
     }
 }
示例#26
0
        /// <summary>
        /// 指定したTransform対して指定した相対的な方角へ重力を働かせる
        /// </summary>
        /// <param name="target"></param>
        /// <param name="direction"></param>
        public void ChangeGravitySource(Transform target, GravitySource direction)
        {
            PreviousGravity = Physics.gravity;
            Vector3 targetSource;

            switch (direction)
            {
            case GravitySource.Forward:
                targetSource         = target.forward * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Forward;
                break;

            case GravitySource.Back:
                targetSource         = -target.forward * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Back;
                break;

            case GravitySource.Right:
                targetSource         = target.right * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Right;
                break;

            case GravitySource.Left:
                targetSource         = -target.right * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Left;
                break;

            case GravitySource.Up:
                targetSource         = target.up * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Up;
                break;

            case GravitySource.Down:
                targetSource         = -target.up * m_gravitationalAcceleration;
                CurrentGravitySource = GravitySource.Down;
                break;

            default:
                throw new System.ArgumentException("Invalid argument");
            }
            Physics.gravity = targetSource;
            // =========
            // Issue an event
            // =========
            OnChangeGravity();
        }
示例#27
0
文件: Planet.cs 项目: santanor/Orbis
        void OnTriggerEnter2D(Collider2D coll)
        {
            GravitySource source = coll.gameObject.GetComponent <GravitySource>();
            Planet        planet = coll.gameObject.GetComponent <Planet>();

            if (source != null)
            {
                if (source != null)
                {
                    source.OnGravityPulse -= OnGravitationalPulseForceApplied;
                    source.OnGravityPulse += OnGravitationalPulseForceApplied;
                }
            }
            else if (planet != null)
            {
                AttachPlanets(planet);
            }
        }
示例#28
0
    public GravityBody(Rigidbody rb, SpinType spinType = SpinType.axis)
    {
        gravitySource = GravitySource.instance;

        transform         = rb.transform;
        this.rb           = rb;
        rb.useGravity     = false;
        rb.freezeRotation = true;

        this.spinType = spinType;
        mass          = 1;
        isWeightless  = true;

        groundHitBuffer = gravitySource.groundHitBuffer;
        attractingPoint = gravitySource.transform;
        gravitySource.AddGravityObject(this);

        orbision = Orbision.Vector3ToOrbision(rb.position);
    }
示例#29
0
    void Start()
    {
        GameManager.SendToMainMenu();
        if (isLocalPlayer)
        {
            MultiplayerManager.localPlayer = this;
            if (MultiplayerManager.onLocalPlayerSpawned != null)
            {
                MultiplayerManager.onLocalPlayerSpawned.Invoke(this);
            }

            motor.enabled = true;

            CameraManager.main.SetTargetInstantly(motor.camera);
            CameraManager.main.OnTransitionFinished += ((Transform lastTarget, Transform target) => {
                if (target == motor.camera)
                {
                    playerView.SetActive(true);
                }
            });
            gameObject.tag = GameManager.gravityTag;
            GravitySource.AddAttractedObject(this);
            rigidbody.useGravity = false;

            foreach (MeshRenderer mr in renderer)
            {
                mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
            }

            CmdSetData(GameManager.GetOrCreatePlayer(AccountManager.Username));

            GameManager.main.dustSpawner.SpawnField();
        }
        else
        {
            motor.camera.gameObject.SetActive(false);
            motor.enabled = false;
            SetName(playerName);
            rigidbody.isKinematic = true;;
        }
    }
示例#30
0
    private SegmentIntersection[] GetValidSegmentIntersections(GravitySource source)
    {
        TrajectoryHandler trajectoryHandler = source.TrajectoryHandler;

        if (trajectoryHandler == null)
        {
            return(new SegmentIntersection[0]);
        }

        List <SegmentIntersection> intersections      = MathUtilities.GetClosestPointsBetweenPolygons(trajectoryPlotter.GetVertices(true), trajectoryHandler.GetVertices(true));
        List <SegmentIntersection> validIntersections = new List <SegmentIntersection>();

        for (int j = 0; j < intersections.Count; j++)
        {
            if (intersections[j].MinDistSq < source.RadiusOfInfluenceSq)
            {
                validIntersections.Add(intersections[j]);
            }
        }
        return(validIntersections.ToArray());
    }