当前位置:   article > 正文

Unity+vrtk实现抓取等功能学习心得_unity vrtk

unity vrtk

一 Unity的基本配置

在进行虚拟现实技术工具包(VRTK)插件的基本操作之前,首先需要对Unity进行适当的配置。我的运行环境基于SteamVR,因此我选择使用Unity 2019.4.28f1c1版本,这是因为该版本与SteamVR的兼容性较好。

插件包导入1.2.3版本的steamvr Plugin

vrtk v4 Tilia Package Importer

插件链接可以在这里面找到Unity 资源商店 - 优质3D 2D游戏制作资源平台

二 VRTK功能使用

VRTK官方提供了许多功能丰富的预制体,这些预制体能够帮助我们快速实现各种VR交互效果。

为了导入这些预制体,我通过Unity的菜单栏,选择Window>Tilia>Package Importer进行打开。

关于这些预制体的具体使用方法,可以参考Extend Reality Ltd - Tilia Packages (vrtk.io)

三 打蜘蛛项目(老师提供模型)

在场景中配置好人物基本操作后,配置场景中的手枪实现抓取使用手枪发射子弹

1 手枪

我在手枪模型上添加了可交互的预制体

并在枪口处加上一个空物体作为子弹发射口。然后,我编写了一段代码,使得手枪在按下特定键位时发射子弹并播放枪声,同时还有枪的动画运动。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ma_zidan : MonoBehaviour
  5. {
  6. public GameObject bulletPrefab; // 子弹预制体
  7. public GameObject bulletPrefab2; // 声音预制体
  8. public GameObject danxia; // 声音预制体
  9. public GameObject gun_animator;
  10. public GameObject bulletCountObject; // 显示子弹数量的物体
  11. private TextMesh bulletCountText; // 显示子弹数量的TextMesh组件
  12. private Animator animator;
  13. private float shootInterval = 0.2f; // 射击间隔时间
  14. private float lastShootTime; // 上一次射击的时间
  15. private int bulletCount = 12; // 子弹数量
  16. void Start()
  17. {
  18. if (bulletCountObject != null)
  19. {
  20. bulletCountText = bulletCountObject.GetComponent<TextMesh>();
  21. if (bulletCountText != null)
  22. {
  23. UpdateBulletCountText();
  24. }
  25. }
  26. }
  27. void Update()
  28. {
  29. if (Input.GetKeyDown(KeyCode.JoystickButton15) && Time.time - lastShootTime >= shootInterval)
  30. {
  31. if (bulletCount > 0)
  32. {
  33. Shoot();
  34. lastShootTime = Time.time;
  35. bulletCount--;
  36. UpdateBulletCountText();
  37. }
  38. if (bulletCount == 0)
  39. {
  40. Instantiate(danxia, transform.position, transform.rotation); // 生成预制体
  41. bulletCount = 12;
  42. }
  43. }
  44. }
  45. void Shoot()
  46. {
  47. animator = gun_animator.GetComponent<Animator>();
  48. if (animator != null)
  49. {
  50. // 修改Animator的参数
  51. animator.SetTrigger("shoot"); // 触发Trigger类型的参数
  52. }
  53. Instantiate(bulletPrefab, transform.position, transform.rotation); // 生成预制体
  54. Instantiate(bulletPrefab2, transform.position, transform.rotation); // 生成预制体
  55. }
  56. void UpdateBulletCountText()
  57. {
  58. if (bulletCountText != null)
  59. {
  60. bulletCountText.text = bulletCount.ToString();
  61. }
  62. }
  63. }
2 蜘蛛动画生命寻路制作

我使用Unity自带的寻路系统烘培出了蜘蛛可以行走的地形

并创建了动画控制器来控制蜘蛛的动画。

然后,我在蜘蛛上面创建了一个片面作为血条,在代码中通过缩放这个片面来表现蜘蛛的生命值变化。

以下是我的代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using static SteamVR_Events;
  5. using UnityEngine.AI;
  6. public class HP : MonoBehaviour
  7. {
  8. private double liang = 0.00253544;
  9. public GameObject hp_plan;
  10. public GameObject zhizhu;
  11. private NavMeshAgent agent;
  12. public int maxHealth = 100; // 最大生命值
  13. public int currentHealth; // 当前生命值
  14. private Animator animator;
  15. private Rigidbody rb;
  16. private void Start()
  17. {
  18. currentHealth = maxHealth; // 初始化当前生命值为最大生命值
  19. animator = GetComponent<Animator>();
  20. agent = GetComponent<NavMeshAgent>();
  21. rb = GetComponent<Rigidbody>();
  22. }
  23. // 受到伤害
  24. public void TakeDamage(int damage)
  25. {
  26. currentHealth -= damage;
  27. if (currentHealth <= 0)
  28. {
  29. CapsuleCollider capsule = GetComponent<CapsuleCollider>();
  30. // 如果找到了CapsuleCollider组件,则将其删除
  31. if (capsule != null)
  32. {
  33. Destroy(capsule);
  34. }
  35. Vector3 scale = hp_plan.transform.localScale;
  36. scale.x = 0;//血量缩放为0
  37. hp_plan.transform.localScale = scale;
  38. Die();
  39. }
  40. else
  41. {
  42. Vector3 scale = hp_plan.transform.localScale;
  43. scale.x = (float)(scale.x - damage * liang);
  44. hp_plan.transform.localScale = scale;
  45. // 受伤时进行旋转
  46. zhizhu.transform.Rotate(-29f, 0f, 0f);
  47. }
  48. }
  49. // 死亡
  50. private void Die()
  51. {
  52. if (animator != null)
  53. {
  54. // 修改Animator的参数
  55. animator.SetTrigger("isdie"); // 触发Trigger类型的参数
  56. }
  57. if (agent != null)
  58. {
  59. agent.isStopped = true;
  60. agent.velocity = Vector3.zero; // 立即停止所有运动
  61. rb.isKinematic = true; // 让Rigidbody不受物理力的影响
  62. //Destroy(navToDelete);
  63. }
  64. xunlu xunluScript = GetComponent<xunlu>();
  65. if (xunluScript != null)
  66. {
  67. // 删除物体上的XunLu脚本组件
  68. Destroy(xunluScript);
  69. }
  70. // 处理死亡逻辑,例如播放死亡动画、移除游戏对象等
  71. Destroy(gameObject,7f);
  72. }
  73. // Update is called once per frame
  74. void Update()
  75. {
  76. }
  77. }

在这个代码中我设置了蜘蛛被打3枪死亡的同时立刻死亡并停止所有动画运动

4 成品视频展示

虚拟vr作业

在完成以上步骤后,我成功实现了一个打蜘蛛的VR游戏项目,其中包括了手枪的抓取、射击、蜘蛛的动画和生命值变化等多种交互效果。我将这个项目的演示视频上传到了网上,供大家参考和学习。

以上就是我在使用Unity和VRTK进行VR游戏开发过程中的一些经验和技巧,希望能对你有所帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/915127
推荐阅读
相关标签
  

闽ICP备14008679号