コード例 #1
0
    private void OnTriggerStay(Collider other)
    {
        if ((Type != BlockType.Empty && Type != BlockType.AlwaysEmpty) || PipeObject != null) return;

        bool straight = other.CompareTag("StraightPipe");
        bool corner = other.CompareTag("CornerPipe");
        if (straight || corner)
        {
            PuzzlePipe pipe = other.GetComponent<PuzzlePipe>();
            if (!pipe.Placed && !pipe.Grabbed)
            {
                PipeObject = other.gameObject;
                PipeObject.transform.position = transform.position;
                PipeObject.transform.forward = transform.forward;
                Grabber.Instance.Release();
                pipe.PlacePipe(this);

                if (straight)
                {
                    Pipe = PipeType.Straight;
                    FlowDir = Flow.LeftRight;
                    Sides = new List<Side>( new Side[] { Side.Left, Side.Right });
                }
                else if (corner)
                {
                    Pipe = PipeType.Corner;
                    FlowDir = Flow.UpRight;
                    Sides = new List<Side>( new Side[] { Side.Up, Side.Right });
                }
                RelatedPuzzle.CheckCompletion();

            }
        }
    }
コード例 #2
0
 public void Release()
 {
     if (!holdingRb)
     {
         return;
     }
     holding = false;
     holdingRb.useGravity = true;
     if (holdingRb.tag.IndexOf("Pipe") > -1)
     {
         PuzzlePipe pipe = holdingRb.GetComponent <PuzzlePipe>();
         pipe.Grabbed = false;
     }
     holdingRb = null;
 }
コード例 #3
0
 public void ThrowRelease()
 {
     if (!holdingRb)
     {
         return;
     }
     holding = false;
     holdingRb.useGravity = true;
     if (holdingRb.tag.IndexOf("Pipe") > -1)
     {
         PuzzlePipe pipe = holdingRb.GetComponent <PuzzlePipe>();
         pipe.Grabbed = false;
     }
     holdingRb.AddForce(Camera.main.transform.forward * 10f, ForceMode.Impulse);
     holdingRb = null;
     AudioController.Instance.PlayThrowSoundClip();
 }
コード例 #4
0
    private void Update()
    {
        if (holding)
        {
            Vector3 targetPos = Camera.main.transform.position + Camera.main.transform.forward * holdDistance;
            float   distance  = Vector3.Distance(holdingRb.transform.position, targetPos);
            Vector3 dir       = targetPos - holdingRb.position;
            holdingRb.velocity          = dir * dragCurve.Evaluate(distance);
            holdingRb.transform.forward = -Camera.main.transform.forward;

            var mouseScroll = Input.mouseScrollDelta.y;

            holdDistance -= mouseScroll * Time.deltaTime * 2f;
            holdDistance  = Mathf.Clamp(holdDistance, holdDistanceMin, holdDistanceMax);

            if (Input.GetKeyDown(KeyCode.R))
            {
                if (holdingRb.CompareTag("Beer"))
                {
                    AudioController.Instance.PlayBeerSoundClip();
                    ThrowUpRelease();
                }
                else if (holdingRb.CompareTag("Radio"))
                {
                    holdingRb.GetComponent <RadioPlayer>().ForceChangeMusicClip();
                }
            }
            else if (Input.GetKeyDown(KeyCode.E))
            {
                Release();
            }
            else if (Input.GetMouseButtonDown(1))
            {
                ThrowRelease();
            }
        }
        else if (Input.GetKeyDown(KeyCode.E))
        {
            if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, maxDistance, GrabbableLayer))
            {
                holdingRb             = hit.collider.GetComponent <Rigidbody>();
                holdingRb.isKinematic = false;
                holdingRb.transform.SetParent(null);
                holdingRb.useGravity = false;
                holding = true;
                if (holdingRb.tag.IndexOf("Pipe") > -1)
                {
                    PuzzlePipe pipe = holdingRb.GetComponent <PuzzlePipe>();
                    pipe.DetachPipe();
                    pipe.Grabbed = true;
                }
            }
            else if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, maxDistance, InteractableLayer))
            {
                if (hit.collider.CompareTag("Electric"))
                {
                    hit.collider.GetComponentInParent <ElectricPuzzle>().ToggleFuse(hit.transform.name);
                }
                else if (hit.collider.CompareTag("Valve"))
                {
                    hit.collider.GetComponentInParent <GasPuzzleValve>().Interact();
                }
            }
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            RaycastHit rayhit;
            if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out rayhit, maxDistance, GrabbableLayer))
            {
                if (rayhit.collider.tag.IndexOf("Pipe") > -1)
                {
                    rayhit.collider.GetComponent <PuzzlePipe>().AttachedBlock.Rotate();
                }
            }
        }
    }