void OnTriggerExit(Collider other) { if (LayerMaskUtil.GetLayerMask(MyLayers.Interactable).Contains(other.gameObject.layer)) { if (other.GetComponent <MonoInteractable>() == currentInteractable) { currentInteractable = null; EventBus.Post(new InteractableChangedEvent()); } } }
void OnTriggerEnter(Collider other) { if (LayerMaskUtil.GetLayerMask(MyLayers.Interactable).Contains(other.gameObject.layer)) { var interactble = other.gameObject.GetComponent <MonoInteractable>(); if (interactble && interactble.enabled) { currentInteractable = interactble; EventBus.Post(new InteractableChangedEvent()); } } }
IEnumerator CoroGenerateSheep() { yield return(new WaitUntil(() => GameContext.Instance)); while (GameContext.Instance.pollutionState == PollutionState.None) { yield return(new WaitForSeconds(0.1f)); var player = GameContext.Instance.player; foreach (var sheep in generatedSheep) { if (!sheep) { continue; } if (Vector3.Distance(player.transform.position, sheep.transform.position) > maxSheepPlayerDist) { Destroy(sheep); } } // 删除销毁的羊 generatedSheep.RemoveAll(x => !x); // 尝试生成一个新的羊 if (generatedSheep.Count < maxSheepCount && (DateTime.Now - _lastGenerateTime).TotalSeconds > minGenerateTime) { var dist = sheepDistRange.random; var dir = UnityEngine.Random.insideUnitCircle; var dir3 = new Vector3(dir.x, 0, dir.y); if (!Physics.Raycast(player.transform.position + Vector3.up, dir3, dist, LayerMaskUtil.GetLayerMask(0))) { var npos = player.transform.position + dir3 * dist; var sheepInstance = Instantiate(prefab, transform); sheepInstance.transform.position = npos; generatedSheep.Add(sheepInstance); _lastGenerateTime = DateTime.Now; XDebug.Log("Generated new sheep"); } else { XDebug.Log("Position failed"); } } } }