protected override Vector3 KinematicProcess(float delta, Vector3 velocity, Vector3 rotationalVelocity) { var speed = velocity.Length(); var direction = velocity.Normalized(); if (speed > 0) { // if (Mathf.Abs(direction.z) > 0) // { var forward = direction.z <= 0; TreePlayer.TransitionNodeSetCurrent(DirectionTransition, forward ? TransitionForward : TransitionBackward); TreePlayer.Blend3NodeSetAmount(forward ? ForwardBlend : BackwardBlend, direction.x); // } // else // { // TreePlayer.TransitionNodeSetCurrent(DirectionTransition, TransitionStrafe); // TreePlayer.TransitionNodeSetCurrent(StrafeTransition, // direction.x < 0 ? TransitionLeft : TransitionRight); // } TreePlayer.TransitionNodeSetCurrent(MoveTransition, TransitionMove); TreePlayer.TimescaleNodeSetScale(ScaleSpeed, speed); } else { TreePlayer.TransitionNodeSetCurrent(MoveTransition, TransitionIdle); } return(_offset.origin / delta); }
// This also called when tree asset is changed // because BTWindow will set new dependencies to "PlaymodeWatcher" public void PlaymodeChanged(bool isPlaymode) { if (isPlaymode) { var lastPlayer = _currentPlayer; _currentPlayer = TreeSelector.CurrentPlayer; if (_currentPlayer != null) { if (_currentPlayer != lastPlayer) { Clear(); RegenerateNodeAccessor(); BindToTasks(lastPlayer, false); BindToTasks(_currentPlayer, true); foreach (var data in _currentPlayer.Tree.NodeData.TaskData) { if (data.TaskImplementation.IsRunning) { TaskStarted(data.TaskImplementation); } } } } } else { Clear(); } }
// ShouldBind == false means unbind private void BindToTasks(TreePlayer player, bool shouldBind) { if (player != null) { foreach (var data in player.Tree.NodeData.TaskData) { if (shouldBind) { data.TaskImplementation.OnStarted += TaskStarted; data.TaskImplementation.OnFinished += TaskFinished; } else { data.TaskImplementation.OnStarted -= TaskStarted; data.TaskImplementation.OnFinished -= TaskFinished; } } } }
protected virtual void ResetAnimations() { TreePlayer.TransitionNodeSetCurrent(MoveTransition, TransitionIdle); }