public bool TestUpdateResources(ResourceRequire resourceRequire) //只判断不更新 { if (!resources.ContainsKey(resourceRequire.resource)) { resources[resourceRequire.resource] = 0; } return(resources[resourceRequire.resource] + resourceRequire.updateVal >= 0); }
IEnumerator SendResourcesOneByOne(ResourceRequire require) { for (int i = 0; i < -require.updateVal; i++) //一次发一个 { Resource.GetInstance().SendResource(fromPos, toPos, player, toMan.GetResourcesManager(), require.resource); yield return(new WaitForSeconds(0.2f)); } }
private void RequestForward(ResourceRequire resourceRequire, int forwardNum) { if (denyForward) { return; } foreach (Pipe pipe in pipesFrom) //如果不可以提供,向上游所有资源供给站发出请求 { pipe.ForwardRequests(resourceRequire, forwardNum + 1); } }
public void SendResource(Vector3 initPos, Vector3 toPos, Player player, ResourcesManager toMan, ResourcesEnum resourcesEnum) //仅发送一个资源 { GameObject obj = Instantiate(resourceObj[resourcesEnum], initPos, Quaternion.identity); Emission entity = obj.GetComponent <Emission>(); entity.SetToWhere(toPos); entity.SetPlayer(player); entity.SetSpeed(0.1f);// entity.OnArrive += (object sender, System.EventArgs e) => { ResourceRequire _require = new ResourceRequire(); _require.resource = resourcesEnum; _require.updateVal = 1; toMan.UpdateResources(_require); }; }
public void SendResources(ResourceRequire resourceRequire, Pipe toPipe, int forwardNum) //传递请求(当前无法满足请求)或发送资源(当前满足请求) { if (forwardNum > maxForwardNum) { return; //传播距离过远(避免循环) } if (!resourcesManager.TestUpdateResources(resourceRequire)) { RequestForward(resourceRequire, forwardNum + 1); } else { resourcesManager.UpdateResources(resourceRequire); toPipe.SendResources(resourceRequire); } }
public bool UpdateResources(ResourceRequire resourceRequire) { ResourcesEnum resource = resourceRequire.resource; int updateVal = resourceRequire.updateVal; if (!resources.ContainsKey(resource)) { resources[resource] = 0; } if (resources[resource] + updateVal < 0 && OnResourcesLack != null) { OnResourcesLack.Invoke(this, resourceRequire);//当缺少资源 return(false); } else { resources[resource] += updateVal; if (OnUpdateSuccess != null) { OnUpdateSuccess.Invoke(this, EventArgs.Empty);//当更新成功资源 } return(true); } }
public void SendResources(ResourceRequire resourceRequire) { StartCoroutine("SendResourcesOneByOne", resourceRequire); }
public void ForwardRequests(ResourceRequire resourceRequire, int forwardNum) { fromMan.SendResources(resourceRequire, this, forwardNum); Debug.DrawLine(toPos, fromPos, Color.red); }