本案例取自邵伟老师所著《Unity VR虚拟现实完全自学教程》一书,场景如图所示:

其中,Box Collider碰撞盒被指定给狙击枪模型WPN_AKM,为Weapon游戏对象添加如下组件:

组件中的Rigidbody,VRTK_Interactable Object(Script),VRTK_Child Of Controller Grab Attach(Script),VRTK_Swap Controller Grab Action(Script),VRTK_Interact Haptics(Script)等,通过菜单命令Window/VRTK/Setup Interactable Object自动加载。持枪的吸附位置定位在空游戏对象Handle上,在组件VRTK_Child Of Controller Grab Attach(Script)中指定,如下图所示:

实现开火射击,是在组件VRTK_Interactable Object_Unity Events(Script)调用脚本组件Weapon中的Shoot方法,如下图所示:

组件VRTK_Interact Controller Appearance(Script)用在游戏运行时隐藏手柄,设置如下图:

VIVE手柄上加载的组件如下图所示,其中VRTK_Object Auto Grab(Script)实现在运行时让Weapon游戏对象替换手柄显示。

Weapon脚本源码如下,邵伟老师已经做了注释:

using UnityEngine;

public class Weapon : MonoBehaviour
{
    // 子弹生成位置
    public Transform firePoint;
    // 枪口火焰特效例子特效
    public ParticleSystem muzzleFlash;
    // 子弹预制体
    public GameObject bulletPrefab;
    // 开枪声音
    public AudioSource fireSound;
    // 射击在金属上的特效
    public GameObject metalHitEffect;
    // 射击在地面上的特效
    public GameObject stoneHitEffect;

// 开枪射击函数,供Use事件调用
    public void Shoot()
    {
        RaycastHit hitInfo;

// 生成子弹实例
        GameObject bulletColone = Instantiate(bulletPrefab);
        // 设置子弹初始位置
        bulletColone.transform.position = firePoint.position;
        // 鉴于模型中心点坐标,在子弹生成后,设置其朝向符合显示子弹朝向
        // 在实际游戏项目中,需要根据具体模型资源设置子弹朝向
        bulletColone.transform.up = -firePoint.forward;

// 发送射线判断是否击中物体
        if (Physics.Raycast(firePoint.position, firePoint.forward, out hitInfo))
        {
            // 分别根据击中碰撞体的Tag生成不同的击中效果
            if (hitInfo.collider.tag == "Metal")
            {
                showHitEffect(metalHitEffect, hitInfo);
            }
            else if (hitInfo.collider.tag == "Stone")
            {
                showHitEffect(stoneHitEffect, hitInfo);
            }
        }

// 播放枪口火焰例子特效
        muzzleFlash.Play();
        // 播放开枪音效
        fireSound.Play();
    }

// 生成弹痕及击中效果
    void showHitEffect(GameObject effectPrefab, RaycastHit hitInfo)
    {
        // 弹痕位置为射线击中点,方向为击中点的法线方向
        GameObject hitEffectClone = Instantiate(effectPrefab, hitInfo.point, Quaternion.LookRotation(hitInfo.normal));
        hitEffectClone.transform.SetParent(hitInfo.transform);
    }
}

运用VRTK实现一个逼真的枪击效果:基于案例分析相关推荐

  1. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  2. html放大镜原理,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  3. JS写一个列表跑马灯效果--基于touchslide.js

    先放上效果图: 类似于这样的,在列表中循环添加背景样式的跑马灯效果. 准备引入JS插件: <script type="text/javascript" src="x ...

  4. 教大家使用PS合成逼真的下雨效果(8)

    教大家使用PS合成逼真的下雨效果(8) 教大家使用PS合成逼真的下雨效果,教程制作出来的下雨效果非常逼真,制作的难度中等,透过这个教程大家可以更好的掌握融图技术和合成时的素材处理办法,让整个画面趋近真 ...

  5. [TGE游戏引擎粒子系统研究]制作逼真得爆炸效果--展示篇

    这个周末还是比较充实的,不过手头工作不少,朋友的软件还没完成,不过禁不住TGE的诱惑,花了点时间,终于把TGE的粒子系统模了个大概,并搞出了一个比较逼真的爆炸效果,总算可以把TGE默认的那个难看的爆炸 ...

  6. anime.js 实战:实现一个带有描边动画效果的复选框...

    在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...

  7. android 一个有漂亮动画效果的Dialog

    原帖地址:http://gitonway.blog.163.com/blog/static/236894038201471102456976/ ※效果  ※简介 一个有漂亮动画效果的Dialog,类似 ...

  8. [css] 使用css3做一个魔方旋转的效果

    [css] 使用css3做一个魔方旋转的效果 总的来说,用了一些 3D 效果的样式,如 translate3d,rotate3d,perspective,transform-style: preser ...

  9. [css] 使用css写一个垂直翻转图片的效果

    [css] 使用css写一个垂直翻转图片的效果 transform: rotateX(180deg); /* 垂直镜像翻转 */ 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持 ...

最新文章

  1. POJ2153 (C++ map)
  2. mysql sum 为 0 的解决方法
  3. Redis使用及工具类
  4. hdu4020简单想法题
  5. 泊松方程与拉普拉斯方程数值解
  6. asp服务器端作用,ASP中的服务器端脚本代码由()解释执行。 - 问答库
  7. Unity3D——C#编译到运行的过程分析
  8. crawler4j mysql_Nutch、heritrix、crawler4j优缺点
  9. 转软件开发过程中的各种文档
  10. 初学者是学习 C 语言还是 C++ 好?各有何利弊?
  11. VUE自学日志04-Data Property 和方法
  12. db2 设置表 not null
  13. Vue插件_自己封装插件_以及使用自定义插件---vue工作笔记0017
  14. SVD奇异值分解(PCA,LSI)
  15. [HIHO1079]离散化(线段树、染色)
  16. Centos系统调优
  17. fluent 对电机油冷分析_如何避免发电机过热引起的能源损耗?
  18. 算法图解笔记(附PDF下载地址)
  19. 计算机WIN7系统网络访问权限设置,win7系统ipv6无网络访问权限如何解决?
  20. 特斯拉Model 3进化不止 传统车企到底应该学什么?...

热门文章

  1. MyBatis从使用到源码(上部:使用)
  2. /tmp 和 /var/tmp 的区别
  3. 推荐几款适用于物联网的开源数据库
  4. php中strtotime函数,PHP中strtotime函数用法
  5. 计算机网络教程网线制作,如何制作网线 进来看看你就会【图文教程】
  6. np.random.normal
  7. php 空指针_空指针Base on windows Writeup
  8. 学习《中观》五个问题解答
  9. 关于word转pdf功能实现
  10. 基于PyTorch+HAN实现中文情感分类任务