Exemple #1
0
 private void OnPlaceButtonPressed(object sender, VRTK.ControllerInteractionEventArgs e)
 {
     Debug.Log("Is state valid? " + pointer.IsStateValid());
     if (pointer.IsStateValid())
     {
         GameObject obj = Instantiate(prefab);
         obj.transform.position    = pointer.pointerRenderer.GetDestinationHit().point;
         obj.transform.eulerAngles = Vector3.up * Random.Range(0f, 360f);
         Debug.Log("Created object & set position to:" + obj.transform.position);
     }
 }
    private void Update()
    {
        lastdt       = Time.deltaTime;
        pointerValid = pointer.IsStateValid();

        RaycastHit hit = pointer.pointerRenderer.GetDestinationHit();

        Vector2 terrainPos  = Vector2.zero;
        float   tHeight     = 0;
        Vector3 floorHitPos = Vector3.zero;

        if (pointerValid)
        {
            floorHitPos = hit.point;
            Vector3 v3pos = hit.point - terrain.transform.position;
            v3pos.x   /= terrain.terrainData.size.x;
            v3pos.y   /= terrain.terrainData.size.y;
            v3pos.z   /= terrain.terrainData.size.z;
            terrainPos = new Vector2(v3pos.x * terrain.terrainData.heightmapWidth,
                                     v3pos.z * terrain.terrainData.heightmapHeight);

            if (tool.usesTargetCylinder)
            {
                targetCircle.gameObject.SetActive(true);
                tHeight = terrain.SampleHeight(hit.point);
                targetCircle.position    = new Vector3(hit.point.x, tHeight + targetCircleFloatHeight, hit.point.z);
                targetCircle.eulerAngles = Vector3.zero;
                targetCircle.localScale  = new Vector3(toolRadius * 2, 1, toolRadius * 2);
                float cylinderHeight = tHeight / 2f + targetCylinderExtraHeight;
                targetCylinder.position   = new Vector3(hit.point.x, cylinderHeight - targetCylinderExtraHeight / 2f, hit.point.z);
                targetCylinder.localScale = new Vector3(1, cylinderHeight, 1);
                if (toolRadius != prevBrushRadius)
                {
                    prevBrushRadius = toolRadius;
                    tool.OnBrushRadiusChange(toolRadius);
                }
            }
        }
        else
        {
            targetCircle.gameObject.SetActive(false);
        }

        Ray        ray = new Ray(transform.position, transform.forward);
        RaycastHit hit2;
        bool       terrainSurfHit = Physics.Raycast(ray.origin, ray.direction, out hit2, 10000f, LayerMask.GetMask("Terrain"));

        hitdat.physicalHitPoint    = terrainSurfHit ? hit2.point : Vector3.zero;
        hitdat.terrainHitPos       = terrainPos;
        hitdat.heightAtFloorPos    = tHeight;
        hitdat.floorHitPos         = floorHitPos;
        hitdat.floorHitPlusTHeight = new Vector3(floorHitPos.x, terrain.SampleHeight(floorHitPos), floorHitPos.z);



        if (tool != null)
        {
            tool.ToolUpdate(hitdat, lastdt);
            if (triggerDown)
            {
                tool.OnMouseHeld(0, hitdat, lastdt, toolRadius, placeablePrefab);
            }
        }
    }