/// <summary> /// Delete a received ray. /// </summary> public void DeleteRayReceiver() { if (RayReceiver != null) { RayReceiver.HitExit(this); RayReceiver = null; } }
/// <summary> /// Save all the items. /// </summary> private void SaveItems() { foreach (Transform item in ItemsContainer.transform) { RaySensitive raySensitive = item.GetComponent <RaySensitive>(); Debug.Log(raySensitive.ItemCode); SaveItem(item); } Debug.Log(_levelData.ToString()); }
/// <summary> /// Save an item. /// </summary> /// <param name="item">Item to be saved.</param> private void SaveItem(Transform item) { JSONObject jsonObject = new JSONObject(); jsonObject.AddField("X", BoardManager.WorldToCellPosition(item.position.x)); jsonObject.AddField("Y", BoardManager.WorldToCellPosition(item.position.z)); jsonObject.AddField("Draggable", false); RaySensitive raySensitive = item.GetComponent <RaySensitive>(); Debug.Log(raySensitive.ItemCode); if (raySensitive.ItemCode == "mirror") { SaveMirrorItem(item, jsonObject); } else if (raySensitive.ItemCode == "filter") { SaveFilterItem(item, jsonObject); } else if (raySensitive.ItemCode == "prism") { SavePrismItem(item, jsonObject); } else if (raySensitive.ItemCode == "filter-mirror") { SaveFilterMirrorItem(item, jsonObject); } else if (raySensitive.ItemCode == "obstacle") { SaveObstacleItem(item, jsonObject); } else if (raySensitive.ItemCode == "standard-turret") { SaveStandardTurretItem(item, jsonObject); } else if (raySensitive.ItemCode == "missile-turret") { SaveMissileTurretItem(item, jsonObject); } else if (raySensitive.ItemCode == "laser-turret") { SaveLaserTurretItem(item, jsonObject); } else if (raySensitive.ItemCode == "light-source") { SaveLightSourceItem(item, jsonObject); } else { return; } _levelData["Entities"].Add(jsonObject); }
public void OnBeginDrag(PointerEventData eventData) { if (ItemQuantity <= 0) { return; } GameObject itemsContainer = BoardManager.Instance.EditorMode ? LevelEditorTD.Instance.ItemsContainer : GameManager.Instance.ItemsContainer; ItemQuantity--; _instanciatedItem = Instantiate(ItemPrefab, Input.mousePosition, Quaternion.identity, itemsContainer.transform); RaySensitive raySensitive = _instanciatedItem.GetComponent <RaySensitive>(); if (raySensitive && raySensitive.MeshCollider) { raySensitive.MeshCollider.convex = false; } }
/// <summary> /// Defined a ray /// </summary> /// <param name="rayEmitter">Source of the ray.</param> /// <param name="color">Color of the ray.</param> /// <param name="direction">Direction of the ray from the source.</param> /// <param name="parent">The ray received.</param> public Ray(RaySensitive rayEmitter, RayColor color, Direction direction, Ray parent) { RayEmitter = rayEmitter; LineRendererParent = new GameObject(string.Format("Ray {0} {1}", color, direction )); LineRendererParent.transform.position = rayEmitter.transform.position + VectorOffset; LineRendererParent.transform.rotation = rayEmitter.transform.rotation; LineRendererParent.transform.parent = rayEmitter.transform; LineRenderer = LineRendererParent.AddComponent <LineRenderer>(); LineRenderer.startWidth = 0.3f; LineRenderer.endWidth = 0.3f; LineRenderer.material = new Material(Shader.Find("Sprites/Default")); LineRenderer.enabled = true; Color = color; Enabled = true; Direction = direction; RayReceiver = null; Parent = parent; Id = CreateId(); }
/// <summary> /// Draw a line in a direction /// </summary> public void Emit() { if (Enabled) { if (LineRenderer.enabled != true) { LineRenderer.enabled = true; } //Debug.Log(string.Format("Ray receiver: {0}", RayReceiver)); // Update the line renderer color SetGradientColor(); // Set line initial position LineRenderer.SetPosition(0, LineRenderer.transform.position); // Set the line renderer position count to two positions (only one segment) LineRenderer.positionCount = 2; int layerMask = 1 << LayerMask.NameToLayer("ActiveItems"); // Check if the ray hits an object in the input direction RaycastHit hit; if (Physics.Raycast( LineRenderer.transform.position, DirectionUtility.GetDirectionAsVector3(Direction), out hit, Mathf.Infinity, layerMask)) { // If the ray hits an object with a collider if (hit.collider) { // Set the end position to the object that was hit position LineRenderer.SetPosition(1, hit.transform.position + VectorOffset); // Check if the object that was hit is a HitObject var rayReceiver = hit.transform.gameObject.GetComponent <RaySensitive>(); // If the receiver hit by the ray is the current receiver if (rayReceiver != null && rayReceiver == RayReceiver) { return; } DeleteRayReceiver(); if (rayReceiver != null) { // Store the new HitObject RayReceiver = rayReceiver; RayReceiver.HitEnter(this); } } // If the ray hits an object with not collider and object and a current HitObject is set else { DeleteRayReceiver(); } } // If the ray hits nothing else { // Draw a line in the input direction to the infinite LineRenderer.SetPosition(1, DirectionUtility.GetDirectionAsVector3(Direction) * 5000); DeleteRayReceiver(); } } else { if (LineRenderer.enabled != false) { LineRenderer.enabled = false; } } }