private void SplitAndEat(long tick, Voxel eater, int deltaHealth, Voxel voxel) { Debug.Assert(voxel.Weight > 0); int weight = voxel.Weight; int owner = voxel.Owner; Vector3 position = voxel.transform.position; m_voxelFactory.Release(voxel); for (int i = 0; i < deltaHealth; i++) { Voxel part = m_voxelFactory.Acquire((int)KnownVoxelTypes.Eatable); VoxelAbilities abilities = m_dataController.AllAbilities[m_dataController.PlayerIndex][part.Type]; part.Owner = owner; part.Weight = weight - 1; part.Height = abilities.EvaluateHeight(part.Weight); float voxelSideSize = Mathf.Pow(2, weight) * GameConstants.UnitSize; Vector3 partPostion = position; int imod4 = i % 4; int imod2 = i % 2; float vssDiv4 = voxelSideSize / 4.0f; float vssDiv2 = voxelSideSize / 2.0f; bool bx = (imod4 == 0 || imod4 == 1); bool bz = (imod2 == 1); partPostion.x += bx ? -vssDiv4 : vssDiv4; partPostion.z += bz ? -vssDiv4 : vssDiv4; partPostion.y += i < 4 ? 0 : vssDiv2; // (bx || !bz) && (!bx || bz) ? 0 : vssDiv2; part.transform.position = partPostion; eater.BeginEat(part, tick); } }
private VoxelData CreateVoxel(Vector3 position, int type, int weight, int height) { Voxel voxel = m_factory.Acquire(type); voxel.transform.position = position; VoxelData data = m_factory.InstantiateData(type); data.Type = type; data.Height = m_selectedAbilities.VariableHeight ? m_selectedAbilities.ClampHeight(height) : m_selectedAbilities.EvaluateHeight(weight); data.Altitude = Mathf.RoundToInt(position.y / GameConstants.UnitSize); data.Weight = weight; data.Owner = Owner; data.Health = m_selectedAbilities.DefaultHealth; data.VoxelRef = voxel; data.Unit = new VoxelUnitData(); data.Unit.State = VoxelDataState.Idle; voxel.ReadFrom(data); voxel.WriteDebugInfo(); return(data); }