// Calculate an entity's default scale private static float GetDefaultScale(Transform target) { if (!target || target == Player.Get().transform) { return(1f); } AIs.AI ai = target.GetComponent <AIs.AI>(); if (ai && ai.m_Spawner) { float aiAverageScale = (ai.m_Spawner.m_MinScale + ai.m_Spawner.m_MaxScale) * 0.5f; if (aiSpawnerPrefab != null) { GameObject aiPrefab = aiSpawnerPrefab.GetValue(ai.m_Spawner) as GameObject; if (aiPrefab) { aiAverageScale *= aiPrefab.transform.localScale.x; } } return(aiAverageScale); } return(1f); }
private EntityData AddScaledEntityToCache(Transform scaledEntity, bool updateSpawnerScale) { EntityData result; int entityIndex = IndexOfEntityInList(scaledEntityCache, scaledEntity); if (entityIndex >= 0) { result = scaledEntityCache[entityIndex]; } else { for (int i = scaledEntityCache.Count - 1; i >= 0; i--) { if (!scaledEntityCache[i].transform) { scaledEntityCache.RemoveAt(i); } } if (scaledEntityCache.Count >= MAX_NUMBER_OF_SCALED_ENTITIES_TO_CACHE) { scaledEntityCache.RemoveAt(0); } result = new EntityData(scaledEntity); scaledEntityCache.Add(result); } // Recalculate animator speed if (result.animator) { result.SetSpeedMultiplier(Mathf.Clamp(1f / GetMultipliedScale(result.transform.localScale.x * result.invDefaultScale, 0.25f), 0.25f, 1f)); } // If this entity isn't just spawned from an AISpawner, set the custom scale value of that AISpawner to this entity's scale if (updateSpawnerScale) { AIs.AI ai = scaledEntity.GetComponent <AIs.AI>(); if (ai && ai.m_Spawner) { AISpawnerEntityScales[ai.m_Spawner] = scaledEntity.transform.localScale.x; } } return(result); }
private void Update() { float currentTime = Time.realtimeSinceStartup; // Don't toggle the menu while typing something to chat if (toggleKey.Length > 0 && !InputsManager.Get().m_TextInputActive) { // Check if configurable key is held // First, make sure that all modifier keys are held bool modifierKeysHeld = true; for (int i = 0; i < toggleKey.Length - 1; i++) { if (!Input.GetKey(toggleKey[i])) { modifierKeysHeld = false; toggleKeyTriggered = false; break; } } if (modifierKeysHeld) { if (!toggleKeyTriggered && Input.GetKeyDown(toggleKey[toggleKey.Length - 1])) { toggleKeyTriggered = true; toggleKeyHeldTime = 0f; } else if (toggleKeyTriggered && Input.GetKey(toggleKey[toggleKey.Length - 1])) { toggleKeyHeldTime += Time.unscaledDeltaTime; if (toggleKeyHeldTime >= toggleKeyHoldDuration) { toggleKeyTriggered = false; SetUIVisible(!uiVisible); } } else { toggleKeyTriggered = false; } } } // Allow rotating the camera while RMB is held if (uiVisible) { if (!rmbHeld && Input.GetMouseButtonDown(1)) { rmbHeld = true; Player.Get().UnblockRotation(); } else if (rmbHeld && Input.GetMouseButtonUp(1)) { rmbHeld = false; Player.Get().BlockRotation(); } } // Allow closing the menu with ESC key if (uiVisible && !InputsManager.Get().m_TextInputActive&& Input.GetKeyDown(KeyCode.Escape)) { SetUIVisible(false); } if (isPickingEntity) { hoveredEntity = null; // Raycast doesn't hit some animals easily, SphereCast is better //RaycastHit hit; //if( Physics.Raycast( CameraManager.Get().m_MainCamera.ScreenPointToRay( Input.mousePosition ), out hit, 100f, aiLayerMask ) ) int hitCount = Physics.SphereCastNonAlloc(CameraManager.Get().m_MainCamera.ScreenPointToRay(Input.mousePosition), 0.25f, raycastHits, 100f, AI_LAYER_MASK); for (int i = 0; i < hitCount && !hoveredEntity; i++) { AIs.AI hitAI = raycastHits[i].transform.GetComponentInParent <AIs.AI>(); if (hitAI) { hoveredEntity = hitAI.transform; if (Input.GetMouseButtonDown(0)) { isPickingEntity = false; pickedEntity = hoveredEntity; Collider aiCollider = hitAI.GetComponent <Collider>(); if (aiCollider) { Vector3 aiBounds = aiCollider.bounds.size; float boundsAverage = (aiBounds.x + aiBounds.y + aiBounds.z) / (3f * hoveredEntity.localScale.x); pickedEntityMinScale = Mathf.Min(MIN_ENTITY_SCALE / boundsAverage, hoveredEntity.localScale.x); pickedEntityMaxScale = MAX_ENTITY_SCALE / boundsAverage; } else { float defaultScale = GetDefaultScale(pickedEntity); pickedEntityMinScale = Mathf.Max(0.1f, defaultScale * 0.1f); pickedEntityMaxScale = Mathf.Max(10f, defaultScale * 10f); } } } } } // Regularly sync IsEnabled value with peers so that new users can fetch its value if (currentTime >= enabledStateNextSyncTime) { SendEnabledStateToPeers(); } // Sync changes made to entities if (currentTime >= modifiedEntitiesNextSyncTime) { modifiedEntitiesNextSyncTime = currentTime + MODIFIED_ENTITIES_SYNC_INTERVAL; P2PNetworkWriter writer = CreateNetworkWriterForChangedEntities(modifiedEntities); if (writer != null) { P2PSession.Instance.SendWriterToAll(writer, 0); // 0: TCP, 1: UDP modifiedEntities.Clear(); } } // Allow scaling player or pickedEntity (must hold Alt) with numpad - and + keys (click * key to reset scale) if (IsEnabled && (uiVisible || canUseHotkeysWhenHidden)) { if (Input.GetKey(KeyCode.KeypadPlus)) { if (!Input.GetKey(KeyCode.LeftAlt)) { SetTargetScale(Player.Get().transform, Player.Get().transform.localScale.x *(1f + KEYBOARD_SCALE_SPEED * Time.deltaTime)); } else if (pickedEntity) { SetTargetScale(pickedEntity, pickedEntity.localScale.x * (1f + KEYBOARD_SCALE_SPEED * Time.deltaTime)); } } else if (Input.GetKey(KeyCode.KeypadMinus)) { if (!Input.GetKey(KeyCode.LeftAlt)) { SetTargetScale(Player.Get().transform, Player.Get().transform.localScale.x *Mathf.Max(0.1f, 1f - KEYBOARD_SCALE_SPEED * Time.deltaTime)); } else if (pickedEntity) { SetTargetScale(pickedEntity, pickedEntity.localScale.x * Mathf.Max(0.1f, 1f - KEYBOARD_SCALE_SPEED * Time.deltaTime)); } } else if (Input.GetKeyDown(KeyCode.KeypadMultiply)) { if (!Input.GetKey(KeyCode.LeftAlt)) { ResetTargetScale(Player.Get().transform); } else if (pickedEntity) { ResetTargetScale(pickedEntity); } } } }