void Start() { // Get a reference to the camera _cam = Camera.main; // Set start transform if (_overrideTransformAtStart) { _cam.transform.rotation = Quaternion.Euler(new Vector3(0, _startRotation, 0)); _rotation = -_startRotation; _currentLookPoint = _startLookPosition; _destinationLookPoint = _startLookPosition; } // Set follow points to current squad members location SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie) { LookAtPosition(currentSquaddie.transform.position, _switchCharacterTime); } // Add an event handler for squad member switching stSquadManager.OnSwitchSquaddie += StSquadManager_OnSwitchSquaddie; }
/// <summary> /// Returns a Vector3 for the camera offset based on where the currently controlled squad member is aiming. /// </summary> private Vector3 GetAimOffset() { if (_aimOffsetDistance > 0) { // Get a reference to the current squaddie's aim script SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie) { PlayerAim aimScript = currentSquaddie.gameObject.GetComponent <PlayerAim>(); if (aimScript) { // Get aim point if (aimScript.IsAiming) { Vector3 aimPoint = aimScript.GetAimMousePoint; Vector3 offsetPoint = aimPoint - currentSquaddie.transform.position; // Get offset & track for next frame Vector3 offset = offsetPoint * Mathf.Clamp01(_aimOffsetDistance); _previousAimOffset = offset; return(offset); } else { return(_previousAimOffset); } } } } return(Vector3.zero); }
/// <summary> /// Event Handler for squad member switching. Handles cam lerping to new location /// </summary> private void StSquadManager_OnSwitchSquaddie() { // Set the camera to switch to the new squaddie's position over _switchCharacterTime seconds. SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie) { LookAtPosition(currentSquaddie.transform.position, _switchCharacterTime); } }
/// <summary> /// Switches to the next available character. Will iterate backwards if reverse is true. /// </summary> public static void Switch(bool reverse = false) { if (!stSettings.CanSwitchSquadMembers) { return; } if (_squadMembers.Count == 0) { Debug.LogWarning("Warning: No current squad members. Cannot switch."); return; } if (_squadMembers.Count == 1) { // Only one squad member available _selected = _squadMembers[0]; _selectedIndex = 0; } // Get index of the next squad member int finalIndex = _squadMembers.Count - 1; int next = _selectedIndex; if (!reverse) { if (next >= finalIndex) { next = 0; } else { next++; } } else { if (next == 0) { next = finalIndex; } else { next--; } } // Select new squad member _selectedIndex = next; _selected = _squadMembers[_selectedIndex]; // Trigger switch event SafeFireOnSwitchSquaddie(); }
/// <summary> /// Event Handler for squad member switching. Handles cam lerping to new location /// </summary> private void StSquadManager_OnSwitchSquaddie() { SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie == this) { SelectSquaddie(); } else { DeselectSquaddie(); } }
void Awake() { // Set each instance in the list to AI mode for (int i = 0; i < _members.Count; i++) { SquaddieController s = _members[i]; if (s == null) { // Remove the reference from the list _members.Remove(s); // De-increment iterator i--; } else { s.DeselectSquaddie(); } } foreach (SquaddieController s in _members) { if (s == null) { _members.Remove(s); } else { s.DeselectSquaddie(); } } // Set the list stSquadManager.SetSquadList(_members); // Set selected squaddie to Control mode SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie) { currentSquaddie.SelectSquaddie(); } DestroyImmediate(this); }
/// <summary> /// Sets the list of controllable squad members /// </summary> /// <param name="members"></param> public static void SetSquadList(List <SquaddieController> members) { // Call switch event with null selection _selected = null; _selectedIndex = 0; SafeFireOnSwitchSquaddie(); // Set list _squadMembers = members; // Select first member if (_squadMembers.Count > 0) { _selected = _squadMembers[0]; SafeFireOnSwitchSquaddie(); } }
void Update() { // Find closest squaddie // Get all squad members List <SquaddieController> squadMembers = stSquadManager.GetSquadMembers; // Find closest squad member float minDistance = float.MaxValue; foreach (var member in squadMembers) { // Find distance between this transform & the member's transform float distance = Vector3.Distance(member.transform.position, transform.position); if (distance < minDistance) { closest = member; } } // Get reference to the range property on the agent uaiProperty p = _aiAgent.FindProperty("InMeleeRange"); if (p != null) { bool inRange = Vector3.Distance(closest.transform.position, transform.position) < _meleeRange; if (inRange) { p.SetValue(1.0f); _agent.destination = _agent.transform.position; _agent.isStopped = true; } else { p.SetValue(0.0f); _agent.isStopped = false; } } }
void Update() { if (!_cam) { _cam = Camera.main; } HandleRotation(); HandlePointSwitching(); // If the camera is lerping, no offsets should apply if (_isSwitchingToNewPoint) { _currentLookPoint = _currentSwitchPoint; _destinationLookPoint = _currentSwitchPoint; // Get new camera position with offsets Vector3 newPos = _currentLookPoint + GetRotationalOffset() * _hoverDistance; _cam.transform.position = newPos; _cam.transform.LookAt(_currentLookPoint, Vector3.up); } else { // The camera is not lerping. Get a look destination that is offset from the current character's position SquaddieController currentSquaddie = stSquadManager.GetCurrentSquaddie; if (currentSquaddie) { Vector3 characterPos = currentSquaddie.transform.position; Vector3 aimPointOffset = GetAimOffset(); Vector3 finalPoint = characterPos + aimPointOffset; FocusOnPoint(finalPoint); } else { FocusOnPoint(_currentLookPoint); } } }
/// <summary> /// Switches to a character at the specified zero-based index. Returns true if /// the switch was successful, otherwise returns false. /// </summary> public static bool SwitchTo(int index) { if (!stSettings.CanSwitchSquadMembers) { return(false); } if (index >= 0 && index < _squadMembers.Count) { if (index != _selectedIndex) { _selectedIndex = index; _selected = _squadMembers[index]; // Trigger switch event SafeFireOnSwitchSquaddie(); return(true); } } return(false); }