VRTK4.0
- P11 抛物线事件
- P12 直线指针
- P13 直线指针 样式修改
- P14 忽略某一层级
- P15 使用导航网格限制移动区域
- P16设置无效目标
- P17 组合动作1 bool转Axes转Vector3(移动)和Angel(旋转)
- P18 组合动作2“移动” 的脚本TransformPositionMutator(位置增变)里的两个元素
- P19 组合动作3“旋转”(旋转增变)
- P20 用手柄控制物体的移动和旋转
- P21 FloatActionToBooleanAction
- L21创建代理操作和链接操作
- L22 InputManager下剩余的三个选项:AxisAction、ButtonAction、DoubleClickAction CombineAction下的AngleRangeToBoolean
- L24其它三种移动方式
- L25 创建一个门
- L26 开门关门
- L27组件属性的讲解
- P29 28-抽屉
- P30 29-用正确的方式开关抽屉和门
- P31 30-可以抓取的物体
- P32 L31关于抓取
- P33 L32动作发布器和动作接收器
- L33在抓取的基础上完成其它操作
- L34 属性讲解
- L35 一个手柄对应一个抓取点
- L36 远距离抓取物体
- L37 远距离抓取属性解读
- L38 创建一个操作杆
- L39 创建物理按钮
- L54 HeadSet代表的“真实身体”进入到了自建的立方体内,伪身体进不去的原因
- L55攀爬(基础篇)
- L56攀爬——解决受PseudoBody的真实、伪身体同步设置影响,爬不上去,老是掉下来的问题。
- L57和L58两种瞬移方式——Instant(立刻)和Dash(猛冲)
- L58的内容:抛物线、瞬移预设体Dash的设置
- L59瞬移区域
- L61 传送点的锁定、移动放大器(略,不是很重要,有时间的时候再处理)
- 63 交互模块下的“Snapzone”(“吸附”突然移动到某地带)
- 65、手柄震动
- L66/Obscurance Tracker(操作略)
- L67 Collision Fader 碰撞调节器?
- 68-限制collision fader只和某些物体交互
- 69-interactable highlighter tooltip 它是Visual中的高亮组件
github官方示例D:\VRTKExample\VRTK 2020.3.33
P11 抛物线事件
Q1、Activation Action、Selection Action这两个Action在作用上的区别是什么?
Q2、 Selection Action为什么曲线是弯曲的?
P12 直线指针
用手柄发射一条直线——用左手柄扳机键发射一条直线:
1、把“追踪别名”预设体的左手柄,赋给“直线指针”预设体的
2、把“左手柄”预设体的扳机键,赋给“直线指针”预设体的
P13 直线指针 样式修改
原理:用它Element项容器(Container)下的物体,替换以下物体脚本上的预设体(还可以让其“仅激活显示”,还是“一直显示”)
控制手柄射线的,就是下图最底下三部分,它们所带脚本都有以上显示设置:
起点 Origin
重复中段 RepeatSegment
目标点 Destination
P14 忽略某一层级
法1 将物体的层Layer设置为ignoreRaycast
法2 比如给指针(直线或抛物线),添加PhysicalCast规则脚本,设置好要忽略的层级后,拖给指针上的ruler元素。
P15 使用导航网格限制移动区域
设置导航网格区域:把Plane和Cube设置为static或StraightStatic后,进行导航烘焙(Window——AI——Navigation——Bake)
给指针或任意物体添加“网格导航规则”(NavMeshRuler)脚本,并把它赋给“TargetPoint Validity”
P16设置无效目标
借用空物体上List Contains Rule,然后取反(空物体上PointerNegationRule),赋给指针上的“TargetPoint Validity”元素
P17 组合动作1 bool转Axes转Vector3(移动)和Angel(旋转)
P18 组合动作2“移动” 的脚本TransformPositionMutator(位置增变)里的两个元素
:限制在某个轴上的移动、朝向
P19 组合动作3“旋转”(旋转增变)
(注意只在Y轴上进行变动,且调用的是TransformEulerRotationMutator)
用键盘按键控制物体的移动和旋转
P20 用手柄控制物体的移动和旋转
Part1:(不用WSAD键了,直接用1D轴预设体)
Part2:(不用轴预设体了,直接用手柄“跟踪板”的水平、垂直)
核心是“CombineAction”(组合模块)里的“AxesToVector3”(轴转三维向量)、“AxesToAngle”(轴转角度)
另需:Movement、Rotation、某手柄预设体
P21 FloatActionToBooleanAction
目的:用手柄的轴,控制二向bool的一个动作
把左手柄的1D轴(扳机键),用FloatToBool脚本的DoTransform方法,转为Bool类型的动作
官方文档中的Axis9,不明白怎么拖入的——直接复制Inspector元素里的名称
把紫框内的FloatAction,用黄线空物体上的脚本变为BooleanAction
左手柄
1DAxes Action
L21创建代理操作和链接操作
重要脚本BooleanAction.cs
1、正常操作
按下扳机键,Plan显示;松开,Plan隐藏
2、代理操作
“代理”是说多个命令,都对应相同操作——我们希望化繁为简:把多个命令放到一个地方。
例子是手柄触摸板的水平轴和扳机键对应同一个操作(如Plan的隐现),即控制源可以是多个物体
“链接”没注意到是什么事儿
L22 InputManager下剩余的三个选项:AxisAction、ButtonAction、DoubleClickAction CombineAction下的AngleRangeToBoolean
1、AxisAction的例子:水平轴控制位移——1DAxisAction的OnValueChange事件监听圆球身上脚本的SetHorizontalPosition方法(需具体例子,脑子里没有概念——手柄的那个部件来控制的)/
2、ButtonAction的例子:WASD吗
3、DoubleClickAction 注意其中的ActionControl和duration元素(控制脚本输出True或False的例子)
4、(操作留)AngleRangeToBoolean第二职业 需要指定手柄的水平轴、竖直轴(测试时,调用的是自己写的脚本)转化成角度,输出在它下面的两个预设体里
“外部角度范围”默认在-180,180的范围内,会输出True——可以设置范围如(0,180)
“内部的轴网络或盲区”不知道表示的含义
除了水平竖直轴外,还有一套类似的DeadZone
L23 移动——位置放的不合适的话,需要手柄来移动(不明确它的作用是什么——用手柄控制某个物体运动自己或者某个GameObject?)
预设体:Locomotor——AxisMove——VerticalSideHorizontalSide(好像是头盔上的VR摄像机跟随某手柄的移动)
具体操作:
把某手柄触控板的水平轴、竖直轴,TrackedAlias的PlayAreaAlias、HeadSetAlias拖入它对应的元素即可,另可调整它下面的属性
L24其它三种移动方式
01“平滑旋转” 预设体是SmoothRotation,比L23中的移动,多了一个旋转轴(头盔),如下图
前方偏移,仍然是头盔别名——ForwardOffset仍然是HeadsetAlias
02“折断旋转”预设体是SnapRotate,如下图多了场景相机SceneCamera:
如果没有SceneCamera,物体瞬间旋转(中间是没有连续的),教程中说可能会产生恶心感;
如果加上SceneCamera,旋转过程会有个黑色过渡,给人的感受要好一些。(除了用黑色外,还可以用以下第二张图的Blind设置颜色)
旋转倍增,原先是一次旋转30度,现在改成一次旋转45度
03最后还有个与02略有差别的包裹的(Wrap)“折断旋转”,设置都和02一样,但效果上的差别没看出来(视频里说是02的改进版)。
L25 创建一个门
导入各种包(留)
建门——手动修改预设(角度关节驱动AngulerJointDrive预设体),把它改成门的形状,并给它添加碰撞体BoxCollider
L26 开门关门
下图一是设置旋转轴和开合度
下图二是设置关节点的位置(左侧两个红框处,有两个旋转点)
另注意开合度是以闭合的初始状态为0点,前-180,后+180
开始移动手柄到门上,门是开不了的——得给手柄加个碰撞
用手柄的带有碰撞体的立方体(如下图2),把门撞开后,门自动闭合的原因——门框有碰撞体,得去掉
也可以用“碰撞忽略”预设体,做出同样的效果,如下图
L27组件属性的讲解
开关门多个属性的讲解(略)
1.DriveSpeed属性 转动的角速度
2.MoveToTargetValue属性 我们设定的门的开合范围是-120~120,如果我们将Value的值设定为0,门就会自动向-120移动,如果我们设置为0,就会固定在中间(如下图)——此时,若我们推动门,它仍旧向目标点移动。
3.HingeLocation、关节线段长度、关节球的半径 下图2
4.其中的几个事件(略)
P29 28-抽屉
核心组件 交互模块的线性关节驱动linear Joint Drive
视频主要讲抽屉的外壳,及抽屉本身的建模
如果已经有抽屉模型,只需把下图的Cube替换即可
P30 29-用正确的方式开关抽屉和门
在上几节课门和抽屉的交互中,我们是给手柄加了立方体,用它来碰——现实中,我们是用手来抓——本节课我们用“交互器”实现抓的动作(把立方体用交互器代替):
交互器中要有实现抓取动作的按钮、及速度追踪者(以后会学到抓取后扔掉的案例,扔的动作需要知道当前的速度)
修改样式替换手部的模型
交互器之所以能够抓取门或抽屉——原因就是都有碰撞体,如果我们只让抽屉的把手能被抓,就把其它的部件碰撞体去掉。
P31 30-可以抓取的物体
总结:抓取的基本操作,Interactor设置Grab Action、Velocity Tracker
Interactable设置“主抓取”、“次抓取”
interactor:"追踪别名"里新建的interactor预设体是负责抓取的抓取动作用手柄的哪个按键(TrackAlias的Left/RightController是真实手柄在层级面板的替身?那置左右手柄预设体为何地?得再去研究TrackAlias)另注明如果我们扔出抓住的物体,物体的速度将跟随LeftControllerAlias?
interactable:可以被抓取的物体(需注明“主抓去”和“次抓取”)
疑问:第6分钟“丢不掉”,是说一直按着真实手柄抓取键,往外扔丢不掉,还是只按一次抓取键,物体就跟随手柄,往外扔丢不掉?
抓取丢不下的原因:第二次抓取(次抓取),应该设置为空
疑问:如果我们只用到一个手柄,也要设置次抓取吗?另外,初始状态的Custom是什么含义
主抓取和次抓取试验:
1、主抓取为Follow,次抓取为None——比如,右手柄抓取物体后,左手柄去抓,将抓不到
2、主抓取为Follow,次抓取为Follow——比如,右手柄抓取物体后,左手柄去抓,能抓到,但松开右手柄抓取键,左手柄上的物体会掉
3、主抓取为Follow,次抓取为Swap(交换)——比如,右手柄抓取物体后,左手柄去抓,能抓到,但松开右手柄抓取键,左手柄上的物体不会掉
4、主抓取为Follow,次抓取为ControlDirection——比如,比如,右手柄抓取物体后,左手柄可以拨动物体,改变它的旋转
另注意:主抓取有三个选项,而次抓取有6个选项
P32 L31关于抓取
本节解说了“可抓取物体”的两个属性:Follow Tracking、Grab Offset
第一部分,可交互物体的FollowTracking元素,里面不同选项的区别
上图中1和2区别:
1能随意穿过带Collider的物体,
2碰撞穿不了
3效果像是手柄和被抓取物体有根橡皮筋相连,注意得同时修改Grab Offset,下图两项都可以
4手柄围着物体转圈,物体跟着转(但好像,抓不起来)
5晃动手柄时,它绕着某个轴进行旋转(可以全部勾选)
第二部分,Grab Offset元素:None或Oritention时,默认抓取的点,是“跟踪别名”里的GrabAttachPoint
而precision则是手柄接触物体上的精确点(看下图,此句话好像也不太对,留)
知识点:改变抓取点的位置——1、改变交互器 2、改变交互物体
2的例子
P33 L32动作发布器和动作接收器
Interactions.ActionPublisher/Interactions.ActionReciever
该需求的原因:interactor只能将一个Float动作(如扣动扳机),传递给Interactble,如果要传两个或多个,就需要用发布器和接收器。举个例子,比如我们在抓取键抓取物体的同时,按一下扳机键,让物体改变透明度。(L32只是完成了抓取操作,另外的操作在L33)
案例是:将浮点数,从“交互器”传到“可交互物体”(疑问是讲:解者,加了“平滑旋转”是为了说明什么(答案,为了让身体跟随右手柄移动),另,我自己做的为什么看不见物体,是没设置UnityXR 的问题吗(答案,UnityXR在2019后废弃,我们用UnityXRpluginFramework)
Tip:动作发布器里“源动作”的类型,可以是:BoolAction、FloatAction、1DAction、Vector2Action,因为它是动作的一个基类
L33在抓取的基础上完成其它操作
总结:
简版:发布器、接收器找到它们附加的源头,接收器再和发布器联系起来——然后发布器的动作,就能触发发布器相应组件的方法了。
详细:发布器、接收器源头是原有的Interactor、interactable,并存在联系(如下两图:发布器对应交互器,接收器对应可交互物体),更像是在原有抓取操作基础上,附加了另外一套(发布器添加附加的动作,接收器处理发布器新传过来的动作【它先要和发布器联系起来】)——我写的,脚本报错,不知问题出在了哪里
对应动作的类型
平常的操作是,按下手柄的键,就能输出一个操作
而此刻(前提是物体被抓着),再按下手柄按键,才能输出一个操作
L34 属性讲解
Tip1、左右发布器的Source Action要一样,不同类型会报错
Tip2、如图激活状态(ActivationState)由Grab改成Custom后,变色失效
Tip3、以上改成Touch,接触到物体,再按下扳机键,物体变色
Tip4、下图第一种抓取方式,松开抓取键,物体会掉下来;第二种Toggle,偶数次按抓取键的时候,
物体会掉下来
Tip5、比如忽略左手的interactor
L35 一个手柄对应一个抓取点
案例:一个宝剑两个手柄来抓取,左右手柄各对应一个抓取点,宝剑的姿势不同
注意Interactions.Interactable的主抓取、次抓取、朝向
步骤:1、造剑的模型 2、“按朝向抓取”Orientation Handler的相关设置
要先把抓取方式GrabType,改为Orientation Handler
下图据说是:真正抓取的位置(怎么理解?)
下图改为2后,不会自动出现新的GenericOrientationHandle,它是我们复制出来的
核心就是上图:就是搞两个不同的实际抓取点,分别对应左右手柄的追踪别名
L36 远距离抓取物体
手柄发出一个类似射击游戏圆形准心的光标,射到物体上,按抓取键即可抓取物体
它对于正常的抓取,只是增加了“远距离抓取预设体”,并把交互器赋给它(类似它代替了原先的交互器Interactor?),并注意设置可抓取物体的主抓取和次抓取。
L37 远距离抓取属性解读
1、“可交互物体”的“抓取类型”HoldTillRelease和Toggle的区别:Toggle到达手中后,不用再按下抓取键
2 、Ungrab Delay第一次抓取完成之后,多久可进行第二次抓取
3、RaycastRuls结合脚本 Physics Cast使用,达成忽略某一层的效果。
4抓取事件
5、远距离抓取,本来就是一个直线指针,怎么让它的射线显示
如下两图所示,直线指针的起点Origin和重复线段,都是AwaysOff的,改一下就显示了
6替换光标图形
L38 创建一个操作杆
核心是交互模块的“角度关节”(AngleJointDrive)
过程见笔记本(最后脚本的开和关方法,一个放在“起点”,一个放在“终点”)如下图
(Unity里有对应的场景L38)
L39 创建物理按钮
核心是交互模块的“线性关节”(LinearJointDrive)
1、 创建ColliderFollower预设体(图一)
原因是——“追踪别名里的Collider和物体碰,是没有任何反应的,因为它身上没有Rigidbody”(不理解),因此才建了ColliderFollower(图二)
2、
L23伪身体(PseudoBody)
总结:赋值源头和偏移两个属性,然后解决真实身体与伪身体不同步的问题
我感觉它像Unity中的第三人称控制器
属性:
1、它追踪(Tracking)的“源头”(Source)是头盔(HeadSet)——也就是说,跟着谁动——伪身体跟随头盔
2、OffSet偏移,为什么是PlayAreaAlias
L54 HeadSet代表的“真实身体”进入到了自建的立方体内,伪身体进不去的原因
具体解决:调用自身StillDiverged事件的图二方法(原理是让两种身体同步),如果还抖动(强制两种身体同步导致的),调节厚度(图三)
L55攀爬(基础篇)
总结:感觉Climbing是个中间件,把伪身体和实质是interactor的Climbale联系起来
需要组件:伪身体、“攀爬运动”预设体(注明谁在爬:图二,把伪身体赋过去)、“可攀爬物体”预设体
步骤:
第一步 Climbing需要伪身体元素,Climbale需要ClimbingFacade元素
第二步,下图可以看到Climbable实质是个interactable——因而需要设置interactor的GrabAction和Velocity Tracker两个属性(不需要设置interactale的主次抓取)
L56攀爬——解决受PseudoBody的真实、伪身体同步设置影响,爬不上去,老是掉下来的问题。
原因:interactor停止接触可抓取物体是时,抓取也停止了
解决:把climbale下的Untouch事件给关掉,如下图(但好像Untouchable事件,是Interactor的事件)
可抓取物体下面,加了一个山(注意,它是先把预设体给Unpack,然后加上的山)
总结:设置联系好后,像抓取那样:设置interactor,interactorale(没有主次抓取,只是关闭了Untouch事件)
瞬移(L57~61)
L57和L58两种瞬移方式——Instant(立刻)和Dash(猛冲)
原理:把PlayAreaAlias移动到抛物线指的位置
核心组件:抛物线指针、instant瞬移
第一步,instant瞬移组件,属性设置:目标位置、偏移(好像是为防止身体偏移)、渐变相机,如下图
第二步,抛物线指针的,
属性设置:源、激活动作、选择动作
方法设置:选择动作命令本身,移动到抛物线指的位置,如下图
L58的内容:抛物线、瞬移预设体Dash的设置
——同Instant(我感觉移动的太快了——可以调整DurationTime,如下图)
L59瞬移区域
效果一、抛物线射到瞬移区域上时,瞬移区域高亮:
用分发器,分发抛物线指针的“移入”、“移出”、“选择”事件,“瞬移区域”自动接收——但此时,并不能瞬移
效果二、按键,瞬移到“瞬移区域”
问题一:课程中说加一个PseudoBody,就能瞬移过去了——但加上后,一运行,屏幕黑一下后,射线在抖动——原因是PseudoBody带刚体,在没有地面的情况下,它落到下面去了
问题二:想让射线只和瞬移区域交互(忽略掉地面)
把地面设置为IgnoreCast层,建物体添加PhysicsCast脚本,忽略该层,然后将物体给抛物线的规则(课程说,把地面换成IgnoreCast层后,他的移动不过去了,得换成别的层——我的没有出现类似情况)
问题三、忽略特定的标签(略)
核心脚本:AnyTagRule、NegationRule
L61 传送点的锁定、移动放大器(略,不是很重要,有时间的时候再处理)
Part一、我感觉只是把“瞬移区域”、“瞬移点”的CollisionVolume给隐藏了
Part二、移动放大器
63 交互模块下的“Snapzone”(“吸附”突然移动到某地带)
小的Tips:移动过去的时间、调整大小
疑问:我的怎么还没抓取,它就自动被吸附过去了(就是自动吸附)
Part1:抓取操作回顾1、抓取动作与速度跟随 2、可抓取物体的主抓取与次抓取
Part2:Snapzone的设置,初始化吸附的物体
64Mutator
1/CollisonIgnore两物体或多个物体忽略碰撞
2/Follow跟随:RigidbodyFollow/ObjectFollow
让跟随者偏移一定距离
65、手柄震动
抓取时震动
Profile方式震动,强度的调整
L66/Obscurance Tracker(操作略)
案例:两个Cube之间直线检测,有遮挡和没遮挡,会产生一个bool时间,控制物体的显示隐藏等。
L67 Collision Fader 碰撞调节器?
内容一、Utility.ObjectStateToSwitch只有其中一个显示,其它拖入元素列表的物体隐藏
内容二、CollisionFader
目的是防止头盔碰到物体后穿入,导致穿帮现象的出现——解决方式是,头盔进入Collision范围后直接黑屏
68-限制collision fader只和某些物体交互
运用规则脚本实现:AnyTagRule
ListContainRule
69-interactable highlighter tooltip 它是Visual中的高亮组件
:当手柄碰到该物体时,物体高亮(模拟器版没有高亮,原因不明确)
ToolTip文本提示