public override void OnInspectorGUI() { D2D_Helper.BaseRect = D2D_Helper.Reserve(0.0f); D2D_Helper.BaseRectSet = true; EditorGUI.BeginChangeCheck(); serializedObject.UpdateIfDirtyOrScript(); Target = (T)target; Targets = targets.Select(t => (T)t).ToArray(); Separator(); OnInspector(); Separator(); serializedObject.ApplyModifiedProperties(); if (EditorGUI.EndChangeCheck() == true) { GUI.changed = true; Repaint(); foreach (var t in Targets) { D2D_Helper.SetDirty(t); } } D2D_Helper.BaseRectSet = false; }
public static byte[] ExtractAlphaData(Texture2D texture) { if (texture != null) { #if UNITY_EDITOR D2D_Helper.MakeTextureReadable(texture); #endif var width = texture.width; var height = texture.height; var total = width * height; var data = new byte[total]; for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { data[x + y * width] = (byte)(texture.GetPixel(x, y).a * 255.0f); } } return(data); } return(null); }
protected virtual void Update() { if (RequiredFixture == null) { D2D_Helper.Destroy(gameObject); } }
public override void RebuildAllColliders() { UpdateCollidable(); DestroyCollider(); var alphaTex = destructibleSprite.AlphaTex; if (alphaTex != null) { var spriteRenderer = D2D_Helper.GetOrAddComponent <SpriteRenderer>(child); var sprite = Sprite.Create(alphaTex, new Rect(0, 0, alphaTex.width, alphaTex.height), Vector2.zero, 1.0f, 0, SpriteMeshType.FullRect); spriteRenderer.sprite = sprite; collider = child.AddComponent <PolygonCollider2D>(); // Disable the collider if it couldn't form any triangles collider.enabled = IsDefaultPolygonCollider2D(collider) == false; D2D_Helper.Destroy(sprite); D2D_Helper.Destroy(spriteRenderer); UpdateColliderSettings(); } }
private static void Split(D2D_Destructible destructible, D2D_SplitGroup group, bool isClone) { var subX = group.XMin; var subY = group.YMin; var subWidth = group.XMax - group.XMin + 1; var subHeight = group.YMax - group.YMin + 1; var subTotal = subWidth * subHeight; var subAlpha = new byte[subTotal]; for (var i = group.Count - 1; i >= 0; i--) { var j = group.Indices[i]; var a = group.Alphas[i]; var x = (j % AlphaTexWidth) - subX; var y = (j / AlphaTexWidth) - subY; var s = x + y * subWidth; subAlpha[s] = a; } destructible.SubsetAlphaWith(subAlpha, subWidth, subHeight, subX, subY); // Split notification D2D_Helper.BroadcastMessage(destructible.transform, "OnDestructibleSplit", splitData, SendMessageOptions.DontRequireReceiver); }
protected virtual void Update() { if (Target != null) { D2D_Helper.SetPosition(transform, Target.transform.position + Offset); } }
public static void BlurVertically() { if (width > 0 && height > 0) { if (tempData.Length < total) { tempData = new byte[total]; } for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var a = GetDefault(x, y - 1); var b = GetDefault(x, y); var c = GetDefault(x, y + 1); var t = (int)a + (int)b + (int)c; tempData[x + y * width] = (byte)(t / 3); } } D2D_Helper.Swap(ref data, ref tempData); } }
public static Vector3 ClosestPointToTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 p) { var r = Quaternion.Inverse(Quaternion.LookRotation(-Vector3.Cross(a - b, a - c))); var ra = r * a; var rb = r * b; var rc = r * c; var rp = r * p; var a2 = D2D_Helper.VectorXY(ra); var b2 = D2D_Helper.VectorXY(rb); var c2 = D2D_Helper.VectorXY(rc); var p2 = D2D_Helper.VectorXY(rp); if (PointLeftOfLine(a2, b2, p2) == true) { return(ClosestPointToLineSegment(a, b, p)); } if (PointLeftOfLine(b2, c2, p2) == true) { return(ClosestPointToLineSegment(b, c, p)); } if (PointLeftOfLine(c2, a2, p2) == true) { return(ClosestPointToLineSegment(c, a, p)); } var barycentric = GetBarycentric(a2, b2, c2, p2); return(barycentric.x * a + barycentric.y * b + barycentric.z * c); }
protected virtual void Awake() { if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>(); // Copy texture from sprite? if (MainTex == null) { var sprite = spriteRenderer.sprite; if (sprite != null) { var texture = sprite.texture; if (texture != null) { MainTex = texture; Pivot = D2D_Helper.Divide(-sprite.bounds.min.x, -sprite.bounds.min.y, sprite.bounds.size.x, sprite.bounds.size.y); PixelsToUnits = D2D_Helper.Divide(texture.width, sprite.bounds.size.x); if (sprite.rect.x != 0 || sprite.rect.y != 0 || sprite.rect.width != texture.width || sprite.rect.height != texture.height) { Debug.LogWarning("The sprite '" + name + "' sent to D2D_DestructibleSprite is either trimmed, or is part of a multiple sprite collection. This is currently not supported."); } } } } }
public void UpdateCollidable() { if (destructibleSprite == null) { destructibleSprite = GetComponent <D2D_DestructibleSprite>(); } if (child == null) { child = D2D_Helper.CreateGameObject("Colliders", transform); } alphaTex = destructibleSprite.AlphaTex; var colliderScale = destructibleSprite.CalculateAlphaTexScale(); var colliderOffset = destructibleSprite.CalculateAlphaTexOffset(); if (child.transform.localPosition != colliderOffset) { child.transform.localPosition = colliderOffset; } if (child.transform.localScale != colliderScale) { child.transform.localScale = colliderScale; } }
protected virtual void Update() { if (dirty == true) { dirty = false; destructible = D2D_Helper.GetComponentUpwards <D2D_Destructible>(transform); if (destructible != null) { var alpha = destructible.GetAlpha(transform.TransformPoint(Offset)); // Break fixture? if (alpha < Threshold) { DestroyFixture(); } // Break others? else if (fixtureID > 0) { for (var i = AllFixtures.Count - 1; i >= 0; i--) { var fixture = AllFixtures[i]; if (fixture != null && fixture != this && fixture.fixtureID == fixtureID) { fixture.DestroyFixture(); } } } } } }
public void Destroy() { if (Collider != null) { Collider = D2D_Helper.Destroy(Collider); } }
public void Explode() { if (Samples > 0) { var origin = transform.position; var step = 360.0f / Samples; var scaledDamage = Damage / Samples; for (var i = 0; i < Samples; i++) { var angle = i * step; var direction = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle)); var hit = Physics2D.Raycast(origin, direction, Radius); var collider = hit.collider; if (collider != null && collider.isTrigger == false) { var mask = 1 << collider.gameObject.layer; if ((mask & Layers.value) != 0) { var damageableSprite = D2D_Helper.GetComponentUpwards <D2D_DamageableSprite>(collider.transform); if (damageableSprite != null) { damageableSprite.InflictDamage(scaledDamage); } } } } } }
private void CheckFixtures() { UpdateState(); fixtures.RemoveAll(f => f == null); // Note: should go first, as the fixture list may change at runtime // Repopulate if it appears clear, as the list may be outdated if (fixtures.Find(f => f.Pinned == true) == null) { fixtures.Clear(); fixtures.AddRange(GetComponentsInChildren <D2D_Fixture>()); } // If we're sure there are no pinned fixtures left, detach! if (fixtures.Find(f => f.Pinned == true) == null) { D2D_Helper.Destroy(OldCollider); if (NewCollider != null) { NewCollider.enabled = true; } if (rigidbody2D.isKinematic == true) { rigidbody2D.isKinematic = false; } D2D_Helper.Destroy(this); } }
public static void Resize(int newWidth, int newHeight) { if (newWidth >= 0 && newHeight >= 0 && width > 0 && height > 0) { var newTotal = newWidth * newHeight; if (tempData.Length < newTotal) { tempData = new byte[newTotal]; } var w = (float)(newWidth - 1); var h = (float)(newHeight - 1); for (var y = 0; y < newHeight; y++) { for (var x = 0; x < newWidth; x++) { tempData[x + y * newWidth] = GetBilinear((float)x / w, (float)y / h); } } width = newWidth; height = newHeight; total = newTotal; D2D_Helper.Swap(ref data, ref tempData); } }
protected virtual void OnWillRenderObject() { if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>(); UpdateSourceMaterial(); DestroyMaterialIfSettingsDiffer(); if (SourceMaterial != null) { // Clone new material? if (clonedMaterial == null) { clonedMaterial = D2D_Helper.Clone(SourceMaterial, false); } else { clonedMaterial.CopyPropertiesFromMaterial(SourceMaterial); } clonedMaterial.hideFlags = HideFlags.DontSave; clonedMaterial.SetTexture("_MainTex", MainTex); clonedMaterial.SetTexture("_AlphaTex", AlphaTex); clonedMaterial.SetFloat("_Sharpness", Sharpness); clonedMaterial.hideFlags = HideFlags.None; } if (spriteRenderer.sharedMaterial != clonedMaterial) { spriteRenderer.sharedMaterial = clonedMaterial; } }
protected override void OnInspector() { EditorGUI.BeginChangeCheck(); { DrawDefault("CellSize"); DrawDefault("Tolerance"); } if (EditorGUI.EndChangeCheck() == true) { foreach (var t in Targets) { if (t != null) { var destructible = D2D_Helper.GetComponentUpwards <D2D_Destructible>(t.transform); if (destructible != null) { t.RebuildAllColliders(destructible.AlphaTex); } } } } EditorGUILayout.Separator(); hideColliders = EditorGUILayout.Toggle("Hide Colliders", hideColliders); foreach (var t in Targets) { t.SetHideFlags(hideColliders == true ? HideFlags.HideInInspector : HideFlags.None); } }
protected virtual void Update() { Seconds -= Time.deltaTime; if (Seconds <= 0.0f) { Destroy(gameObject); } else { if (FadeOut == true) { if (spriteRenderer == null) { spriteRenderer = GetComponent <SpriteRenderer>(); } var color = spriteRenderer.color; color.a = Mathf.Clamp01(D2D_Helper.Divide(Seconds, FadeSeconds)); spriteRenderer.color = color; } } }
void Update() { if (!DataCenter.CanFire || UICamera.isOverUI) { return; } // Begin dragging? if (Input.GetMouseButton(0) == true && down == false) { down = true; } // End dragging? if (Input.GetMouseButton(0) == false && down == true) { down = false; // Fire? if (Camera.main != null) { var endMousePosition = Input.mousePosition; var startPos = shootPos.position; var endPos = Camera.main.ScreenToWorldPoint(endMousePosition); var vec = endPos - startPos; var angle = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness; var clone = D2D_Helper.CloneGameObject(Resources.Load <GameObject>("Prefabs/Bomb/Bomb" + (DataCenter.currSelectBomb + 1)), null, startPos, Quaternion.Euler(0.0f, 0.0f, angle)); var cloneRb2D = clone.GetComponent <Rigidbody2D>(); if (cloneRb2D != null) { cloneRb2D.velocity = (endPos - startPos).normalized * Mathf.Min(20.0f, Vector3.Distance(endPos, startPos)); } EventSystem.DispatchEvent(EType.Fire); } } // Show dragging? if (Indicator != null) { Indicator.enabled = down; if (Camera.main != null && down == true) { var currentMousePosition = Input.mousePosition; var startPos = shootPos.position; var currentPos = Camera.main.ScreenToWorldPoint(currentMousePosition); var scale = Vector3.Distance(currentPos, startPos); var angle = D2D_Helper.Atan2(currentPos - startPos) * Mathf.Rad2Deg; scale = Mathf.Min(20.0f, scale); Indicator.transform.position = shootPos.position; Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, -angle); Indicator.transform.localScale = new Vector3(scale, scale, scale); } } }
private void DestroyAutoPolygonCollider() { if (autoPolygonCollider != null) { D2D_Helper.Destroy(autoPolygonCollider.gameObject); autoPolygonCollider = null; } }
private Vector2 CalculateAlphaScale(Sprite sprite) { var texture = sprite.texture; var textureRect = sprite.textureRect; var scaleX = D2D_Helper.Divide(texture.width, Mathf.Floor(textureRect.width) + AlphaShiftX) * D2D_Helper.Divide(OriginalWidth, AlphaWidth); var scaleY = D2D_Helper.Divide(texture.height, Mathf.Floor(textureRect.height) + AlphaShiftY) * D2D_Helper.Divide(OriginalHeight, AlphaHeight); return(new Vector2(scaleX, scaleY)); }
private void DestroyPolygonCollider2D() { if (polygonCollider2D != null) { D2D_Helper.Destroy(polygonCollider2D); polygonCollider2D = null; } }
private void DestroyPolygonColliders() { if (polygonColliders != null) { D2D_Helper.Destroy(polygonColliders.gameObject); polygonColliders = null; } }
public static Matrix4x4 CalculateStampMatrix(Vector2 position, Vector2 size, float angle) { var t = D2D_Helper.TranslationMatrix(position.x, position.y, 0.0f); var r = D2D_Helper.RotationMatrix(Quaternion.Euler(0.0f, 0.0f, angle)); var s = D2D_Helper.ScalingMatrix(size.x, size.y, 1.0f); var o = D2D_Helper.TranslationMatrix(-0.5f, -0.5f, 0.0f); // Centre stamp return(t * r * s * o); }
public void Destroy() { if (PolygonCollider2D != null) { D2D_Helper.Destroy(PolygonCollider2D); PolygonCollider2D = null; } }
protected virtual void Update() { // Begin dragging? if (Input.GetMouseButton(0) == true && down == false) { down = true; startMousePosition = Input.mousePosition; } // End dragging? if (Input.GetMouseButton(0) == false && down == true) { down = false; // Fire? if (Camera.main != null && Bullet != null) { var endMousePosition = Input.mousePosition; var startPos = Camera.main.ScreenToWorldPoint(startMousePosition); startPos.Scale(new Vector3(1, 1, 0)); var endPos = Camera.main.ScreenToWorldPoint(endMousePosition); endPos.Scale(new Vector3(1, 1, 0)); var vec = endPos - startPos; var angle = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness; var clone = D2D_Helper.CloneGameObject(Bullet, null, startPos, Quaternion.Euler(0.0f, 0.0f, angle)); var cloneRb2D = clone.GetComponent <Rigidbody2D>(); if (cloneRb2D != null) { cloneRb2D.velocity = (endPos - startPos) * Power; } } } // Show dragging? if (Indicator != null) { Indicator.enabled = down; if (Camera.main != null && down == true) { var currentMousePosition = Input.mousePosition; var startPos = Camera.main.ScreenToWorldPoint(startMousePosition); var currentPos = Camera.main.ScreenToWorldPoint(currentMousePosition); var scale = Vector3.Distance(currentPos, startPos); var angle = D2D_Helper.Atan2(currentPos - startPos) * Mathf.Rad2Deg; var newPos = Camera.main.ScreenToWorldPoint(startMousePosition); newPos.Scale(new Vector3(1, 1, 0)); Indicator.transform.position = newPos; Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, -angle); Indicator.transform.localScale = new Vector3(scale, scale, scale); } } }
public void Destroy() { for (var i = Colliders.Count - 1; i >= 0; i--) { D2D_Helper.Destroy(Colliders[i]); } Colliders.Clear(); }
public void Destroy() { foreach (var edgeCollider2D in EdgeCollider2Ds) { D2D_Helper.Destroy(edgeCollider2D); } EdgeCollider2Ds.Clear(); }
private void DestroyEdgeColliders() { if (edgeColliders != null) { D2D_Helper.Destroy(edgeColliders.gameObject); edgeColliders = null; } }
protected virtual void Update() { if (Input.GetMouseButton(0) == true && down == false && Time.timeScale == 1) { down = true; startMousePosition = Input.mousePosition; } mouse_pos = Input.mousePosition; object_pos = Camera.main.WorldToScreenPoint(SpawnPoint.transform.position); mouse_pos.x = mouse_pos.x - object_pos.x; mouse_pos.y = mouse_pos.y - object_pos.y; var angle2 = Mathf.Atan2(mouse_pos.y, mouse_pos.x) * Mathf.Rad2Deg; if (Input.GetMouseButton(0) == false && down == true) { down = false; if (angle2 < 50 && angle2 > -50) { if (Camera.main != null && Bullet != null) { var endMousePosition = Input.mousePosition; var startPos = Camera.main.ScreenToWorldPoint(startMousePosition); var endPos = Camera.main.ScreenToWorldPoint(endMousePosition); var vec = (endPos - startPos) * Power; var angle = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness; Vector3 rotationVector = new Vector3(0, 0, angle2); SpawnPoint.transform.rotation = Quaternion.Euler(rotationVector); var clone = D2D_Helper.CloneGameObject(Bullet, null, SpawnPoint.transform.position, Quaternion.Euler(0.0f, 0.0f, angle2)); var cloneRb2D = clone.GetComponent <Rigidbody2D>(); if (cloneRb2D != null) { cloneRb2D.velocity = (endPos - startPos) * Power; cloneRb2D.AddForce(new Vector2(100, 50)); } } } } if (Indicator != null && angle2 < 50 && angle2 > -50) { Indicator.enabled = down; if (Camera.main != null && down == true) { var currentMousePosition = Input.mousePosition; var startPos = Camera.main.ScreenToWorldPoint(SpawnPoint.transform.position); var currentPos = Camera.main.ScreenToWorldPoint(currentMousePosition); var scale = Vector3.Distance(currentPos, startPos); Debug.Log(scale); Indicator.transform.position = SpawnPoint.transform.position; Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, angle2); Indicator.transform.localScale = new Vector3(scale / 15, scale / 15, scale / 15); } } }