Здравствуйте. В настоящее время я работаю над школьным проектом по взлому предметов и их удержанию. Я работал с инструментом разрушения в Блендере и импортировал мои объекты в единство и разбивал их с помощью Steam Player с каменным топором. Obj ломается слишком легко и искал, чтобы улучшить его. Через некоторое время я нашел парня по имени VR с Эндрю , который делает учебные пособия, такие как Unity + Vive Tutorial - Melee Damage . Работал взад и вперед над рукопашной атакой, в которой будут использованы стены, дерево и т. Д.
Мне удалось исправить код в определенной степени, но я продолжаю застрять в некоторых частях. Его недавнее видео на SteamVR помогло ускорить процесс, а также документация в формате pdf от SteamVR, а вот его недавнее видео на steamvr 2.2:
[Unity] Обновление входа SteamVR 2.2
Вот сценарии, над которыми я работал, заставили их работать до сих пор, однако я застрял на 10 ошибках и не могу найти способ их исправить, некоторая помощь была бы благодарна!
Скрипт ViveInput: https://pastebin.com/Smm1vhTH
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
namespace Valve.VR.InteractionSystem.Sample
{
public class ViveInput : MonoBehaviour
{
public SteamVR_Action_Boolean mDevice;
// private SteamVR_TrackedObject mTrackeObject = null;
private Interaction mInteraction = null;
public Hand hand;
public GameObject prefabToMagic;
private void OnEnable()
{
if (hand == null)
hand = this.GetComponent<Hand>();
}
void Awake()
{
// mTrackeObject = GetComponent<SteamVR_TrackedObject>();
// mInteraction = GetComponent<Interaction>();
//mDevice = SteamVR_Actions._default.GrabPinch;
}
/*private void Update()
{
if (SteamVR_Input.GetState("resource", "Resource", hand.handType))
//(SteamVR_Actions.farming.Plant[hand.handType].state)
Resource();
} */
private void Update()
{
// mDevice = SteamVR_Input.inActions.GrabPinch.GetStateUp(hand.handType);
#region Trigger
// Down
if (SteamVR_Input.GetState("resource", "Resource", hand.handType))
{
mInteraction.Pickup(mDevice);
}
// Up
if (mDevice.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
{
mInteraction.Drop(mDevice);
}
// Value
Vector2 triggerValue = mDevice.GetAxis(EVRButtonId.k_EButton_SteamVR_Trigger);
#endregion
#region Grip
/*// Down
if (mDevice.GetPressDown(SteamVR_Controller.ButtonMask.Grip))
{
print("Grip down");
}
// Up
if (mDevice.GetPressUp(SteamVR_Controller.ButtonMask.Grip))
{
print("Grip up");
}
#endregion
#region Touchpad
// Down
if (mDevice.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
{
print("Touchpad down");
}
// Up
if (mDevice.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad))
{
print("Touchpad up");
} */
Vector2 touchValue = mDevice.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
#endregion
}
}
}
Скрипт взаимодействия: https://pastebin.com/Vq72jyCh
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
namespace Valve.VR.InteractionSystem.Sample
{
public class Interaction : MonoBehaviour
{
public GameObject controllerMeshObject;
private FixedJoint mAttachJoint = null;
private Rigidbody mCurrentRigidBody = null;
private List<Rigidbody> mContactRigidBodies = new List<Rigidbody>();
void Awake()
{
mAttachJoint = GetComponent<FixedJoint>();
}
void OnTriggerEnter(Collider collider)
{
if (!collider.gameObject.CompareTag("Interactable"))
return;
// Add the object to contact list
mContactRigidBodies.Add(collider.gameObject.GetComponent<Rigidbody>());
}
void OnTriggerExit(Collider collider)
{
if (!collider.gameObject.CompareTag("Interactable"))
return;
// Remove the object to contact list
mContactRigidBodies.Remove(collider.gameObject.GetComponent<Rigidbody>());
}
public void Pickup()
{
// Get nearest
mCurrentRigidBody = GetNearestRigidbody();
if (!mCurrentRigidBody)
return;
// Set to position of axe
mCurrentRigidBody.transform.position = transform.position;
mCurrentRigidBody.transform.localEulerAngles = new Vector3(0, -180, -90);
// Pass info to axe
mCurrentRigidBody.gameObject.GetComponentInChildren<StoneAxe>().Setup(GetComponent<ViveInput>().mDevice, this);
// Ensure the correct physics settings
mCurrentRigidBody.useGravity = true;
mCurrentRigidBody.isKinematic = false;
// Connect to controller
mAttachJoint.connectedBody = mCurrentRigidBody;
// Disable tomato
controllerMeshObject.SetActive(false);
}
public void Drop(SteamVR_Action_Boolean mDevice)
{
if (!mCurrentRigidBody)
return;
// Apply velocity
if (device != null)
{
mCurrentRigidBody.velocity = device.velocity;
mCurrentRigidBody.angularVelocity = device.angularVelocity;
}
// Disable physics
else
{
mCurrentRigidBody.useGravity = false;
mCurrentRigidBody.isKinematic = true;
}
// Disconnect from controller
mAttachJoint.connectedBody = null;
mCurrentRigidBody = null;
// Enable tomato
controllerMeshObject.SetActive(true);
}
private Rigidbody GetNearestRigidbody()
{
Rigidbody nearestRigidBody = null;
float minDistance = float.MaxValue;
float distance = 0.0f;
// For each object we are touching
foreach (Rigidbody contactBody in mContactRigidBodies)
{
// The length of the vector is square root of (x*x + y*y + z*z).
distance = (contactBody.gameObject.transform.position - transform.position).sqrMagnitude;
if (distance < minDistance)
{
minDistance = distance;
nearestRigidBody = contactBody;
}
}
return nearestRigidBody;
}
}
}
ShatterObject: https://pastebin.com/m5TdCaBr
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR.InteractionSystem;
using Valve.VR;
namespace Valve.VR.InteractionSystem.Sample
{
public class ShatterOnCollision : MonoBehaviour
{
public GameObject mLogOne;
public GameObject mLogTwo;
public ParticleSystem Splinter;
private Collider mCollider = null;
void Awake()
{
mCollider = GetComponent<Collider>();
}
void OnTriggerEnter(Collider collider)
{
// Is it a blade
if (!collider.gameObject.CompareTag("StoneAxe"))
return;
StoneAxe stoneaxe = collider.gameObject.GetComponent<StoneAxe>();
// Is the blade in use?
if (device.mDevice == null)
return;
// Check for log split
Split(stoneaxe);
}
private void Split(StoneAxe stoneaxe)
{
Splinter.Play();
// Split log
if (stoneaxe.mDevice.velocity.magnitude > 3.0f)
{
// Disable collision, so we only split once
mCollider.enabled = false;
// Enable physics for both sides
EnablePhysics(mLogOne);
EnablePhysics(mLogTwo);
}
// Stick Axe
else if (stoneaxe.mDevice.velocity.magnitude > 1.0f)
{
stoneaxe.mInteraction.Drop(null);
}
}
private void EnablePhysics(GameObject log)
{
mLogOne.transform.parent = null;
Rigidbody rigidBody = log.GetComponent<Rigidbody>();
rigidBody.useGravity = true;
rigidBody.isKinematic = false;
}
}
/* void OnCollisionEnter()
{
GameObject.Instantiate(replacement, transform.position, transform.rotation);
Destroy(gameObject);
} */
}
Вот мой фрагмент об ошибках, которые показывают мои Unity Errors .
Надеемся, что код и изображения немного помогли, и если у вас есть какие-либо советы или рекомендации по улучшению компоновки кода, производительности и т. Д., Не стесняйтесь говорить, я хотел бы получить как можно больше критики, это очень поможет моему классу, изучая с двух сторон и больше !!
Спасибо и хорошего дня!