示例#1
0
 private void UnhighlightTeleportPoint()
 {
     if (prevTeleportPoint)
     {
         prevTeleportPoint.Unhighlight();
         prevTeleportPoint = null;
     }
 }
示例#2
0
 static void SitIn()
 {
     if (Selection.activeGameObject)
     {
         SnappingTeleportingPoint tpPoint = Selection.activeGameObject.GetComponent <SnappingTeleportingPoint>();
         if (tpPoint && tpPoint.snappingPoint)
         {
             Vector3 position = tpPoint.snappingPoint.position + Vector3.up * 1.3f;
             Vector3 pivot    = position + tpPoint.snappingPoint.forward * SceneView.lastActiveSceneView.cameraDistance;
             SceneView.lastActiveSceneView.rotation = tpPoint.snappingPoint.transform.rotation;
             SceneView.lastActiveSceneView.pivot    = pivot;
         }
     }
 }
示例#3
0
    public Matrix4x4 Cast(Transform sourceTransform, Vector2 inputDirection)
    {
        if (this.castingObjectTransform == null)
        {
            this.castingObjectTransform = sourceTransform;
        }
        else if (this.castingObjectTransform != sourceTransform)
        {
            return(Matrix4x4.zero);
        }
        visualizerAssembly.SetActive(true);
        transform.position = sourceTransform.position;
        Parabola parabola = Parabola.Cast(sourceTransform.position, sourceTransform.forward * strength,
                                          stepSize, maxSteps);

        for (int i = 0; i < bones.Count; i++)
        {
            TennisSim.Utility.ApplyMatrixToTransform(bones[i], parabola.GetNormalizedPathMatrix((float)i / (bones.Count - 1)));
            //bones[i].rotation = Quaternion.AngleAxis(90, bones[i].right) * Quaternion.AngleAxis(90, bones[i].up) * bones[i].rotation;
            bones[i].rotation = Quaternion.AngleAxis(90, bones[i].up) * Quaternion.AngleAxis(-90, bones[i].right) * bones[i].rotation;
        }

        if (parabola.hasDestination)
        {
            SnappingTeleportingPoint teleportPoint = parabola.hitObject.GetComponent <SnappingTeleportingPoint>();
            if (teleportPoint)
            {
                if (prevTeleportPoint != teleportPoint)
                {
                    UnhighlightTeleportPoint();
                    prevTeleportPoint = teleportPoint;
                    teleportPoint.Highlight();
                }
                destinationArrow.gameObject.SetActive(false);
                return(teleportPoint.snappingPoint.localToWorldMatrix);
            }
            else
            {
                UnhighlightTeleportPoint();

                if (Vector3.Angle(parabola.normal, Vector3.up) <= acceptableUpAngle)
                {
                    destinationArrow.gameObject.SetActive(true);
                    destinationArrow.position = parabola.destination;
                }
                else
                {
                    // Cast a ray straight down to find ground.
                    RaycastHit hit;
                    if (Physics.Raycast(parabola.destination + Vector3.up * .001f, -Vector3.up, out hit))
                    {
                        if (Vector3.Angle(hit.normal, Vector3.up) <= acceptableUpAngle)
                        {
                            destinationArrow.gameObject.SetActive(true);
                            Vector3 backOffWallVector = parabola.normal;
                            backOffWallVector.y       = 0;
                            backOffWallVector         = backOffWallVector.normalized * backOffWallDistance;
                            destinationArrow.position = hit.point + backOffWallVector;
                        }
                    }
                }

                if (destinationArrow.gameObject.activeSelf)
                {
                    Vector3 right     = Vector3.Cross(Vector3.up, sourceTransform.forward).normalized;
                    Vector3 forward   = Vector3.Cross(right, Vector3.up);
                    Vector3 direction = right * inputDirection.x + forward * inputDirection.y;
                    destinationArrow.rotation = Quaternion.LookRotation(direction);
                    return(destinationArrow.localToWorldMatrix);
                }
            }
        }
        destinationArrow.gameObject.SetActive(false);
        return(Matrix4x4.zero);
    }