private void ListenFunc(AssembleAcceptBase _assembleAcceptBase) { if (OnContainerFullAction != null) { if (CheckMatch_ContainerFull()) { Debug.Log("成功配对ContainerFull"); OnContainerFullAction.Invoke(); containeGroupInfos.Clear(); OnContainerFullAction = null; } } if (OnMatch_OneToOneAction != null) { if (CheckMatch_OneToOne()) { Debug.Log("成功配对OneToOne"); OnMatch_OneToOneAction.Invoke(); acceptBase_OneToOne = null; AssembleContainerBase_OneToOne = null; OnMatch_OneToOneAction = null; } } if (OnMatch_OneToManyAction != null) { if (CheckMatch_OneToMany()) { Debug.Log("成功配对OneToMany"); OnMatch_OneToManyAction.Invoke(); acceptBase_OneToMany = null; AssembleContainerBase_OneToMany.Clear(); OnMatch_OneToManyAction = null; } } }
/// <summary> /// 开始装配 /// </summary> /// <param name="_containerBase"></param> public override void BeginAssmeble(AssembleContainerBase _containerBase) { base.BeginAssmeble(_containerBase); if (tempContainer != null) { tempContainer = null; curPointIndex = 0; MoveFunc(); } }
/// <summary> /// 开始装配 /// </summary> /// <param name="_containerBase"></param> public virtual void BeginAssmeble(AssembleContainerBase _containerBase) { useCount++; containerBase = _containerBase; containerBase.BeginAssmeble(this); if (OnAssembleBegin != null) { OnAssembleBegin.Invoke(this); } }
private void Drag() { if (!isActive) { return; } if (!isUse) { assembleManager.OnSelect.Invoke(this); PrepareAssmeble(); } else if (prepareFinish) { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; containerBase = null; if (Physics.Raycast(ray, out hit, 100) && hit.transform.name == obj.name) { screenPosition = Camera.main.WorldToScreenPoint(obj.transform.position); mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z); offset = obj.transform.position - Camera.main.ScreenToWorldPoint(mScreenPosition); isButtonDown = true; } if (OnDragBegin != null) { OnDragBegin.Invoke(); } } if (Input.GetMouseButton(0) && isButtonDown) { mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z); obj.transform.position = Camera.main.ScreenToWorldPoint(mScreenPosition) + offset; } if (Input.GetMouseButtonUp(0) && isButtonDown) { isUse = false; isActive = false; isButtonDown = false; tempContainer = FindContainer(); if (JugeAssmeble(tempContainer)) { BeginAssmeble(tempContainer); } if (OnDragEnd != null) { OnDragEnd.Invoke(this, containerBase); } } } }
/// <summary> /// 判断能否装配 /// </summary> /// <param name="_assembleContainerBase"></param> /// <returns></returns> public virtual bool JugeAssmeble(AssembleContainerBase _assembleContainerBase) { if (_assembleContainerBase == null) { return(false); //如果射线没有打到容器,则不能执行装配 } if (containerBase != null) { return(false); //如果当前装配物已被装配,则不能执行装配 } if (!_assembleContainerBase.CanUse) { return(false); //如果容器不可用,则不能执行装配 } if (_assembleContainerBase.assembleType != assembleType) { return(false); //如果容器类型不匹配,则不能执行装配 } if (_assembleContainerBase.gameObject == gameObject) { return(false); //如果物体既是装配物又是容器,防止自身装配至自身的容器中。 } return(true); }
/// <summary> /// 当装配器装配到指定容器中时调用 Action /// </summary> public void OnMatch_OneToOne(string _acceptName, string _containerName, Action action) { acceptBase_OneToOne = FindAcceptByName(_acceptName); AssembleContainerBase_OneToOne = FindContainerByName(_containerName); OnMatch_OneToOneAction = action; }