Planting.cs
2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR.InteractionSystem;
namespace Valve.VR.InteractionSystem.Sample
{
public class Planting : MonoBehaviour
{
public SteamVR_Action_Boolean plantAction;
public Hand hand;
public GameObject prefabToPlant;
private void OnEnable()
{
if (hand == null)
hand = this.GetComponent<Hand>();
if (plantAction == null)
{
Debug.LogError("<b>[SteamVR Interaction]</b> No plant action assigned", this);
return;
}
plantAction.AddOnChangeListener(OnPlantActionChange, hand.handType);
}
private void OnDisable()
{
if (plantAction != null)
plantAction.RemoveOnChangeListener(OnPlantActionChange, hand.handType);
}
private void OnPlantActionChange(SteamVR_Action_Boolean actionIn, SteamVR_Input_Sources inputSource, bool newValue)
{
if (newValue)
{
Plant();
}
}
public void Plant()
{
StartCoroutine(DoPlant());
}
private IEnumerator DoPlant()
{
Vector3 plantPosition;
RaycastHit hitInfo;
bool hit = Physics.Raycast(hand.transform.position, Vector3.down, out hitInfo);
if (hit)
{
plantPosition = hitInfo.point + (Vector3.up * 0.05f);
}
else
{
plantPosition = hand.transform.position;
plantPosition.y = Player.instance.transform.position.y;
}
GameObject planting = GameObject.Instantiate<GameObject>(prefabToPlant);
planting.transform.position = plantPosition;
planting.transform.rotation = Quaternion.Euler(0, Random.value * 360f, 0);
planting.GetComponentInChildren<MeshRenderer>().material.SetColor("_TintColor", Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f));
Rigidbody rigidbody = planting.GetComponent<Rigidbody>();
if (rigidbody != null)
rigidbody.isKinematic = true;
Vector3 initialScale = Vector3.one * 0.01f;
Vector3 targetScale = Vector3.one * (1 + (Random.value * 0.25f));
float startTime = Time.time;
float overTime = 0.5f;
float endTime = startTime + overTime;
while (Time.time < endTime)
{
planting.transform.localScale = Vector3.Slerp(initialScale, targetScale, (Time.time - startTime) / overTime);
yield return null;
}
if (rigidbody != null)
rigidbody.isKinematic = false;
}
}
}