public ITentacleState ChangeState(Tentacle tentacle, GameObject gameObject) { if (state_ == ToParentSubState.partialReturn && tentacle_.Head_.GetComponent <TentaclePart>().atDestination) { return(new AtTargetState(tentacle.Target_, tentacle)); } if (state_ == ToParentSubState.partialReturn && !tentacle.IsDefending_()) { return(new ToTargetState(tentacle.Target_, tentacle)); } if (tentacle.bodyPartCount_ == 0) { return(new DeadState(tentacle)); } return(this); }
public ITentacleState ChangeState(Tentacle tentacle, GameObject gameObject) { if (tentacle.gotCut_) { return(new CutState(tentacle, tentacle_.cutOrigin_)); } if (tentacle.IsDefending_() && atCell_) { return(new ToParentState(tentacle.Target_, tentacle)); } if (!targetCell_.Targets_.Contains(tentacle_.ParentCell_.gameObject) && tentacleHead_.TargetGO.tag != "Cell")//If target cell stopped defending { tentacleHead_.targetGO_ = tentacle_.Target_; return(new ToTargetState(tentacle.Target_, tentacle)); } return(this); }
void HandleExtensionMovement() { travelTime_ += Time.deltaTime; if (travelTime_ > travelSpeed_) { foreach (GameObject bodyPart in tentacle_.BodyParts_) { TentaclePart part = bodyPart.GetComponent <TentaclePart>(); if (!part.atDestination) { if (part.BodyPartId_ == 0 && tentacle_.IsDefending_()) { if (middleGO_ == null) { Vector3 midlePos = Vector3.MoveTowards(part.targetGO_.transform.position, tentacle_.transform.position, Vector3.Distance(tentacle_.transform.position, part.targetGO_.transform.position) / 2); midlePos = Vector3.MoveTowards(midlePos, tentacle_.Target_.transform.position, 0.1f); middleGO_ = new GameObject(); middleGO_.transform.position = midlePos; part.targetGO_ = middleGO_; } part.transform.position = Vector3.MoveTowards(part.transform.position, part.targetGO_.transform.position, Tentacle.travelSpeed_ * Time.deltaTime); } else { if (part.BodyPartId_ == 0 && middleGO_ != null) { part.targetGO_ = tentacle_.Target_; } Vector3 variable = Vector3.MoveTowards(part.targetGO_.transform.position, tentacle_.transform.position, 0.2f); float distance = Vector3.Distance(part.transform.position, variable); float distance2D = Vector2.Distance(part.transform.position, variable); part.transform.position = Vector3.MoveTowards(part.transform.position, Vector3.MoveTowards(part.targetGO_.transform.position, tentacle_.transform.position, 0.2f), Tentacle.travelSpeed_ * Time.deltaTime); } } } travelTime_ = 0; } }
public ITentacleState ChangeState(Tentacle tentacle, GameObject gameObject) { if (tentacle.ParentCellCurrentHealth <= 0 || tentacle.gotCut_)//TODO: isDefending is not enough to know wether the tentacle should expant or contract, need a better solution { return(new ToParentState(tentacle.Target_, tentacle)); } if (headPart_.atDestination) { return(new AtTargetState(tentacle.Target_, tentacle_)); } if (tentacle.IsDefending_()) { float distanceFromHeadToParent = Vector3.Distance(tentacle_.Head_.transform.position, tentacle_.transform.position); Vector3 middlePoint = (tentacle_.transform.position + tentacle_.Target_.transform.position) / 2; float distanceFromMiddleToParent = Vector3.Distance(middlePoint, tentacle_.transform.position); if (distanceFromHeadToParent >= distanceFromMiddleToParent) { return(new ToParentState(tentacle.Target_, tentacle)); } } return(this); }