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);
        }
    }
Esempio n. 4
0
    /// <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();
    }
Esempio n. 5
0
    /// <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);
    }
Esempio n. 7
0
    /// <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);
            }
        }
    }
Esempio n. 10
0
    /// <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);
    }