User Tools

Site Tools


dragengine:modules:dragonscript:behavior_grabber

ECBehaviorGrabber

Behavior adding support to grab an ECBehaviorGrabSpot.

Grab spots are typically used for physics interaction like VR hand use but can be used also with mouse interaction. The actual grabbing interaction, exact grab location and orientation as well as attaching logic is handled by other behaviors using listening. This behavior also tracks if what grab spot an actor is grabbing. Hence at most one grab spot can be grabbed by this behavior at each time.

Elements able to be grabbed have to use the ECBehaviorGrabSpot behavior. Both the grab spot and the grabber have to persist the other behavior. During restoring no notifications are triggered this way.

To detect grab spots a touch sensor is added with a default sphere shape. By default the touch sensor is disabled and has to be enabled if the game logic allows grabbing. The collision filter category is set to BaseGameApp.CollisionFilterBit.trigger and the collision filter mask is set to BaseGameApp.CollisionFilterBit.dynamic.

Instance Counts

This behavior can be added multiple times to an element. Use the behavior identifier to tell them apart.

Element Class Properties

Element class properties have the prefix grabber. or grabber(id). if id is not empty.

shape

Shape of collider used to detect grab spots.

  • Full name: grabber.shape or grabber(id).shape
  • Type: string (shape format). See “Shape List Encoding” in CodecPropertyString.
  • Default Value: empty string
  • Example (*.deeclass):
    <string name='grabber(right).shape'>box:extends,0.1,0.1,0.1</string>

position

Attach position relative to parent element or bone.

  • Full name: grabber.position or grabber(id).position
  • Type: 3-component float vector
  • Default Value: (0, 0, 0)
  • Example (*.deeclass):
    <vector name='grabber(right).position' x='0' y='0' z='0.1'/>

rotation

Attach orientation in euler degrees relative to parent element or bone.

  • Full name: grabber.rotation or grabber(id).rotation
  • Type: 3-component float vector
  • Default Value: (0, 0, 0)
  • Example (*.deeclass):
    <vector name='grabber(right).rotation' x='-45' y='0' z='0'/>

bone

Name of bone to attach to or empty string to attach to the parent element.

  • Full name: grabber.bone or grabber(id).bone
  • Type: string
  • Default Value: empty string
  • Example (*.deeclass):
    <string name='grabber(right).bone'>attach hand.r</string>

Events

spotGrabbed

Grabber grabbed grab spot.

spotReleased

Grabber released grab spot.

touchGrabSpot

Start touching grab spot.

untouchGrabSpot

Stop touching grab spot.

canTouchGrabSpot

Grab spot can be touched if all listeners return true.

enabledChanged

Grabber enabled changed.

Behavior Tree Actions

This behavior adds these behavior tree actions if behavior tree is present. If behavior has non-empty identifier replace grabber with grabber(id).

grabber.set

Set one or more grabber parameters.

ParameterValueDescription
enabledtrue, falseGrabber is enabled

This is an example of using this action:

<action name='grabber.set'>
  <parameter name='enabled'>true</parameter>
</action>

grabber.release

Release grab spot if grabbing one.

This is an example of using this action:

<action name='grabber.release'/>

grabber.check

Check one or more grabber parameters. Action succeeds if all parameter value matches their respective grabber parameter otherwise action fails. This action is typically used as first action in a sequence to run the sequence only if a grabber parameter matches (or not).

ParameterValueDescription
enabledtrue, falseGrabber is enabled
grabbingtrue, falseGrabber is grabbing a grab spot
wait If present action returns BTResult.running instead of BTResult.failed to wait until the checks are all fulfilled

This is an example of using this action:

<sequence>
  <action name='grabber.check'>
    <parameter name='grabbing'>true</parameter>
  </action>
  <!-- actions here run only if grabber is grabbing a grab spot -->
</sequence>

Behavior Tree Conditions

This behavior adds these behavior tree conditions if behavior tree is present. If behavior has non-empty identifier replace grabber with grabber(id).

grabber.check

Check one or more grabber parameters. Conditions returns true if all parameter value match their respective grabber parameter. This condition is typically used to run an action or sequence of actions as long as grabber conditions are true.

ParameterValueDescription
grabber.enabledtrue, falseGrabber is enabled
grabber.grabbingtrue, falseGrabber is grabbing a grab spot

This is an example of using this condition:

<action name='myAction' id='doing something'>
  <parameter name='grabber.grabbing'>true</parameter>
  <condition>grabber.check</condition>
</action>

State Machine Actions

State Machine Conditions

State Machine Events

This behavior sends these state machine events. If behavior has non-empty identifier replace grabber with grabber(id).

grabber.enabled

Grabber has been enabled.

grabber.disabled

Grabber has been disabled.

grabber.grabbed

Grabber grabbed grab spot.

grabber.released

Grabber released grab spot.

grabber.touch

Start touching grab spot.

grabber.untouch

Stop touching grab spot.

Required Behaviors

This behavior does require other behaviors.

Optional Behaviors

Persistency

This behavior does support element class to be persistable (setPersistable).

API Documentation

ECBehaviorGrabber.

Since DragonScript Module Version 1.9

Use Cases

  • Grab objects in VR

Element Class Example

The following example creates an element class with support to test what element the player is pointing at:

class MyElement extends BehaviorElementClass
   public var ECBehaviorVRPlayspace vrPlayspace
   public var ECBehaviorVRHand vrHandRight
   public var ECBehaviorVRHand vrHandLeft
   public var ECBehaviorGrabber vrRightHandGrabber
   public var ECBehaviorGrabber vrLeftHandGrabber
   
   public func new()
      // Create playspace
      vrPlayspace = ECBehaviorVRPlayspace.new(this)
      
      // Create hand controllers. The InputDeviceType indicates what device type
      // to monitor. vrRightHand and vrLeftHand can exist only once
      vrHandRight = ECBehaviorVRHand.new(this, vrPlayspace, InputDeviceType.vrRightHand, "right")
      vrHandLeft = ECBehaviorVRHand.new(this, vrPlayspace, InputDeviceType.vrLeftHand, "left")
      
      // Create grabbers for each hand
      vrRightHandGrabber = ECBehaviorGrabber.new(this, vrRightHand, "right")
      vrLeftHandGrabber = ECBehaviorGrabber.new(this, vrLeftHand, "left")
  end
end

The BaseVRActorClass provides full VR support including ECBehaviorGrabber for both hands.

Behavior Factory

Using element class supporting adding behaviors the behavior can be added like this:

<?xml version='1.0' encoding='UTF-8'?>
<elementClass name='MyClass' class='GenericBehaviorElement'>
  <behavior type='ECBehaviorVRPlayspace'/>
  <behavior type='ECBehaviorVRHand' id='right'/>
  <behavior type='ECBehaviorVRHand' id='left'/>
 
  <behavior type='ECBehaviorGrabber' id='right'>
    <!-- optional: use vr hand with id instead of empty string -->
    <string name='vrHand'>right</string>
 
    <!-- optional: set collision filter. default value '4:1' which means
                   category BaseGameApp.CollisionFilterBit.trigger
                   filter BaseGameApp.CollisionFilterBit.dynamic.
                   format is '', 'category' or 'category:filter' where category and filter
                   are a list of bits to set. -->
    <string name='collisionFilter'>4:1 2</string>
 
    <!-- optional: use behavior tree with id instead of empty string -->
    <string name='behaviorTree'>second</string>
 
    <!-- optional: use state machine with id instead of empty string -->
    <string name='stateMachine'>second</string>
 
    <!-- set element properties. omit property prefix if used inside behavior tag -->
    <string name='.bone'>hand.r</string>
  </behavior>
 
  <!-- for adding multiple behaviors use unique identifiers -->
  <behavior type='ECBehaviorCustomColor' id='left'>
    <string name='vrHand'>left</string>
    <string name='.bone'>hand.l</string>
  </behavior>
</elementClass>

Live Examples

You could leave a comment if you were logged in.
dragengine/modules/dragonscript/behavior_grabber.txt · Last modified: 2025/05/04 13:46 by dragonlord