XEmitter
To make them animate in realtime preview, edit a variable (then change it back)
Dma: I've found that the best way to test xEmitters is to bind a key to:
SUMMON MyPack.MyXEmitter
and using the command:
EDITDEFAULT class=MyXEmitter
to control the properties for all xEmitters that you will spawn. This allows you to test the results without exiting the game.
The Display → Skin property sets the texture of the emitter. (Do these only emit sprites? How lame!) Display
Properties
Main
Force
- bool bForceAffected
- This causes the particles to be affected by passing objects (including players). This only has an effect with highest physics details.
Pclbeam - Particle Beam Properties
These are used if mSpawningType is PT_Beam.
- float mBendStrength
- float mWaveAmplitude
- float mWaveFrequency
- bool mWaveLockEnd
- float mWaveShift
Pclemitter - General Particle Emitter Properties
- bool bSuspendWhenNotVisible
- Suspends emission of particles if the xEmitter is not visible. Useful for level optimization.
- float mLifeRange[2]
- The particles will live for a random duration that falls between these two values.
- float mDelayRange[2]
- Emission of particles will be delayed by a random duration that falls between these two values.
- float mRegenRange[2]
The xEmitter regeneration cycles on and off for durations controlled by the following two variables:
- float mRegenOnTime[2]
- Emission ON cycle lasts for a random duration that falls between these two values.
- float mRegenOffTime[2]
- Emission OFF cycle lasts for a random duration that falls between these two values.
- Name mChildName
- The Tag to give to child particles (or name? needs checking)
- int mMaxParticles
- Sets a limit on the number of particles emitted (please clarify!).
- bool mRegen
- Enables or disables regeneration. Note: changing this in UnrealEd somehow breaks the real time preview of the effect, and if you still want to see it in the editor you might have to re-create your emitter from scratch. IIRC Checker from DE pointed that out.
- enum mParticleType
- Sets the type of particle to emit:
- PT_Sprite
- PT_Stream
- PT_Line
- PT_Disc
- PT_Mesh
- PT_Branch
- PT_Beam
- float mRegenDist
- bool mRegenPause
- Effectively pauses emitter regeneration. It remains ready for use but does not emit anything. Existing particles are unaffected.
- Name mSourceActor
- ExSpawningTypes mSpawningType
- Describes the manner in which particles are spawned.
- StaticMeshActor SourceStaticMesh
Pclmovement - Particle Movement Properties
- float mSpinRange[2]
- float mSpeedRange[2]
- The particles will have a random scalar speed somewhere between these two values. The direction is determined by the rotation of the xEmitter????
- float mMassRange[2]
- The particles will have a random "mass" somewhere between these two values. This determines the effect that gravity has on the particles. In fact, negative values make the particles float upwards. This basically controls the gravity.
- float mAirResistance
- Sets the effect that air resistance has on the particles.
- float mAttraction
- Attractive force between particles
- float mColElasticity
- Bounciness of particle collision. (0-1)
- bool mCollision
- ? Enables collision for particles. ?
- bool mColMakeSound
- ? Enables the CollisionSound notification event. ?
- vector mDirDev
- float mOwnerVelocityFactor
- The owner's velocity is added to the particle velocity after being scaled by mOwnerVelocityFactor.
- vector mPosDev
- bool mPosRelative
- vector mSpawnVecA
- vector mSpawnVecB
Pclsoftbody
- float springD
- float springK
- float springMaxCompress
- float springMaxStretch
Pclvisuals - Visual Particle Properties
- color mColorRange[2]
- StaticMesh mMeshNodes[8]
- if using meshes as particle nodes
- float mSizeRange[2]
- EAttenFunc mAttenFunc
- Attenuation function.
- float mAttenKa
- Attenuation constant A.
- float mAttenKb
- Attenuation constant B.
- bool mAttenuate
- Enable particle attenuation.
- bool mDistanceAtten
- float mGrowthRate
- Texture mLifeColorMap
- int mNumTileColumns
- int mNumTileRows
- Texture mPosColorMapXY
- Texture mPosColorMapXZ
- bool mRandMeshes
- bool mRandOrient
- bool mRandTextures
- Choose a random texture for each instance of this emitter
- bool mTileAnimation
- Animate the particle from the set of tiles throughout life
- bool mUseMeshNodes
Hidden - Native Stuff!
- bool bCallPreSpawn
- Call the PreSpawned event.
- bool blockOnNet
- int Expire
- int mAtLeastOneFrame
- Box mBounds
- int mbSpinningNodes
- xEmitter mChildEmitter
- vector mDir
- int mHeadIndex
- float mInvTileCols
- vector mLastPos
- vector mLastVector
- int mNumActivePcl
- int mNumSprings
- int mNumUpdates
- int mpAttenFunc
- float mPauseTimer
- pointer mpIterator
- pointer mpParticles
- ptr to tarray
- pointer mpSprings
- ptr to Spring class
- float mRegenBias
- float mRegenTimer
- int mRenderableVerts
- plane mSphere
- float mT
- delta
- float mTexU
- float mTexV
- float mTime
- float mTotalTiles
- float mWavePhaseA
- float mWavePhaseB
- int SystemHandle
Enums
ExSpawningTypes
- ST_Sphere
- ST_Line
- ST_Disc
- ST_Cylinder
- ST_AimedSphere
- ST_StaticMesh
- ST_Explode
- ST_ExplodeRing
- ST_OwnerSkeleton
- ST_Test
EAttenFunc
These functions work using mAttenKa and mAttenKb.
- ATF_LerpInOut
- Linearly interpolates in and out according to the following formula: (please verify, just a guess)
x(t) = mAttenKa + t(mAttenKb - mAttenka)
- ATF_ExpInOut
- ATF_SmoothStep
- ATF_Pulse
- ATF_Random
- ATF_None
Functions
- event PreSpawned()
- Called if bCallPreSpawn is true. Used for detail level stuff, among other things.
- event CollisionSound()
- I suppose that this is called if mColMakeSound is true.
Links
Misc.
xEmitters and Glass
xEmitters seem to have problems with visibility through glass. It appears that the xEmitter will display through one translucent surface, but not through two.
In other words, a sheet would be fine (having only one face), but a box (having a bottom and a top face) would block its visiblity. (does this hold with other types of see-through surfaces like grates, or do these all count as the same sort of thing in UT2k3 anyway?)
GRAF1K: Assuming you're talking about masked sheets when you say grates, I Don't Know™. But, I'm 99.9% sure that masked sheets are treated as merely selectively translucent surfaces, making it the same.
Foxpaw: I tried this in an attempt to answer your question, and found that I couldn't hide the xemitter no matter what I did. I made an x-shaped map with an xemitter in each leg, then isolated one with a sheet, one with double sheets, and one with a box (not sealed) and one with a box. (sealed off to form it's own zone) All the "blocking" things had a smoke texture with an alpha channel on it so I could see through it. In my experiment, the xemitters were visible behind all of the blocking devices.
Having said that, I suspect that the issue of the visibility is actually due to the "line of sight" being blocked, and not due to the actual number of faces between the two objets. A sheet doesnt block anything, so you could see it through the sheet, but a box blocks your line of sight, thus blocking the xemitter. Or at least, that's what I would think.
RDGDanClark: I think it has something to do with a property setting somewhere in the xEmitter. I pulled up CTF-ComArray, and if you're familiar with that map, it uses xEmitters under the superstructure much the same way I tried to do with my map. On ComArray, you can see the xEmitter through everything; glass, grates, any texture with an alpha channel. I copied/pasted the xEmitter into my map and it worked fine through my glass floors. I'll start playing around with all the settings and post what I find.
AlphaOne: Does bForceAffected actually work? I tried it with the Emitter class (not XEmitter) and nothing happens.
AlexAC: on the subj of bForceAffected it does work a little on norm emitters, well they are affected by redemer shots, and xemitters react darn well to rockets, players and stuff i assume the setting is also bForceAffected.
Karp: Is there anybody able to complete this list?
Tarquin: Well... someone (not me, I'm too much of a grouch) could ask Rachel to come and help us on this page, maybe import some of what she wrote on UnrealOps. Or we could see what the UDN says, and write up the properties we've found there. Or we could each pick one property, play with it in UEd and try to work out what effect it has & write it up here. All three would be good