Пример #1
0
 private void UpdateStateColliders(BonesState bonesState)
 {
     _borderColliders.ForEach(border =>
     {
         border.isTrigger = bonesState == BonesState.Sleep;
     });
 }
    private void UpdatePos()
    {
        // The position only needs to be updated if we're attached to an object
        if (_attachedTo == null)
        {
            return;
        }

        switch (_spec.GetSpace())
        {
        // We are attached to one of the bones of the object
        case PartSysEmitterSpace.NodePos:
        case PartSysEmitterSpace.NodeYpr:
            _prevObjPos      = _objPos;
            _prevObjRotation = _objRotation;
            External.GetObjRotation(_attachedTo, out _objRotation);

            if (External.GetBoneWorldMatrix(_attachedTo, _spec.GetNodeName(), out var boneMatrix))
            {
                _objPos = boneMatrix.Translation;
            }
            else
            {
                // As a fallback we use the object's location
                External.GetObjLocation(_attachedTo, out _objPos);
            }

            break;

        // We're attached to the world position of the object
        case PartSysEmitterSpace.ObjectPos:
        case PartSysEmitterSpace.ObjectYpr:
            _prevObjPos = _objPos;
            External.GetObjLocation(_attachedTo, out _objPos);
            // The rotation is only relevant when we're in OBJECT_YPR space
            if (_spec.GetSpace() == PartSysEmitterSpace.ObjectYpr)
            {
                _prevObjRotation = _objRotation;
                External.GetObjRotation(_attachedTo, out _objRotation);
            }

            break;

        case PartSysEmitterSpace.Bones:
            if (_boneState == null && _attachedTo != null)
            {
                _boneState = new BonesState(External, _attachedTo);
            }

            _boneState?.UpdatePos();
            break;
        }
    }
    public void SetAttachedTo(object attachedTo)
    {
        _attachedTo = attachedTo;

        // Reinitialize the bone state we're tracking for the object
        if (_spec.GetSpace() == PartSysEmitterSpace.Bones)
        {
            _boneState = null;
            if (attachedTo != null)
            {
                _boneState = new BonesState(External, attachedTo);
            }
        }

        UpdatePos();
    }