`
maloveqiao
  • 浏览: 101959 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

fps 翻译 第二部分

 
阅读更多
第二部分:进阶


这部分是中级教程,介绍游戏中类似多武器切换、毁伤和敌人等。
前提条件
这部分教程假设你已经熟悉Unity基本操作和基本的脚本概念。同时,你对第一部分的内容也已经熟知。
关卡设置
下载Fps_Tutorial.zip,解压,Unity中打开工程文件夹。如果你已经完成了第一部分教程那么把文件解压到新的文件夹下面。
导入标准资源包
把mainLevelMesh和FPS controller预制增加到场景中
注意:这部分教程中无需创建新脚本。我们使用下载的那些脚本。
武器切换
在涉及如何创建个别武器之前,我们需要写一些代码来控制武器如何出现和如何切换。我们来看看脚本PlayerWeapons的内容:
function Awake()
{
// Select the first weapon
SelectWeapon(0);
}
这段程序初始化0号武器作为默认武器。
function Update()
{
// Did the user press fire?
if (Input.GetButton ("Fire1"))
BroadcastMessage("Fire");
if (Input.GetKeyDown("1"))
{
SelectWeapon(0);
}
else if (Input.GetKeyDown("2"))
{
SelectWeapon(1);
}
}
这段程序检测键盘输入:开火键、数字“1”代表1号武器、数字“2”代表2号武器。武器都要设为主摄像机的子物体。
function SelectWeapon(index : int)
{
     for (var i=0;i<transform.childCount;i++)
     {
         // Activate the selected weapon
         if (i == index)
              transform.GetChild(i).gameObject.SetActiveRecursively(true);
              // Deactivate all other weapons
         else
              transform.GetChild(i).gameObject.SetActiveRecursively(false);
       }
}
这段是根据键盘输入激活相应的武器。


下面来使用上面那些代码:


创建一个空游戏物体(empty game object),命名为“武器”,把它拖放到主摄像机下设为主摄像机的子物体(FPS controller中的摄像机)。我们的武器都将设为这个空物体的子物体。
把脚本PlayerWeapons赋予摄像机下的游戏物体“武器”
下面来创建第一个武器
火箭发射器
这部分来讲讲如何制作类似火箭发射器的武器。
发射器
火箭发射器用来产生一枚火箭弹并给它一个初速度。火箭弹发射的方向为角色指向的任意方向,并且它将在与其它任意碰撞器发生碰撞时爆炸。
增加一个空游戏物体,命名为“RocketLauncher”。把这个空游戏物体的位置移动到FPS Controller大概手部的位置。
层级栏中,把RocketLauncher拖放到主摄像机下作为主摄像机的子物体。这样的话,可以使发射器的发射方向与摄像机一致,同时发射器的移动也与FPS Controller一致了。
工程栏中,点击Object文件夹下的发射器,在参数设置面板中,把FBXImporter下的Scale Factor设置为1,否则模型在场景中不是真实大小,会非常小。
把Object文件夹下的模型物体rocketLauncher拖放使其成为游戏物体RocketLauncher的子物体。
发射器的脚本RocketLauncher内容如下:
var projectile : Rigidbody;
var initialSpeed = 20.0;
var reloadTime = 0.5;
var ammoCount = 20;
private var lastShot = -10.0;
function Fire ()
{
     // Did the time exceed the reload time?
     if (Time.time > reloadTime + lastShot && ammoCount > 0)
     {
          // create a new projectile, use the same position and rotation as the Launcher.
          var instantiatedProjectile : Rigidbody = Instantiate (projectile,transform.position, transform.rotation);
          // Give it an initial forward velocity. The direction is along the z-axis of
          // the missile launcher's transform.
          instantiatedProjectile.velocity = transform.TransformDirection(Vector3 (0, 0, initialSpeed));
          // Ignore collisions between the missile and the character controller
          Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider);
          lastShot = Time.time;
          ammoCount--;
      }
}


这段代码确保了物体发射速度不大于reloadTime(加载时间)。它同时还使玩家在danyao数量足够的条件下才能开火。
这里火箭发射的行为定义,有些类似前面基础教程,除了这里有发射加载时间和dy限制。
把脚本RocketLauncher赋予给RocketLauncher游戏物体。不能把脚本赋予给RocketLauncher游戏物体的子物体(模型物体)!

现在我们在场景中创建一个火箭弹并放置一个预制体中(Prefab)。
工程栏中的Object文件夹下点选rocket,在FBXImporter中设置ScaleFactor为1,否则模型导入到场景中会非常小。
把rochet物体拖放到场景中。
赋予Rocket脚本。
给模型rocket增加一个box collider,调节box碰撞器大小,使其比火箭弹模型稍微大一点点即可,避免穿透错误。穿透错误是由于游戏物体大小很小、速度很快,导致碰撞监测不能计算与它的碰撞从而发生了穿透现象。在Z轴向调节box碰撞器大小,使它能有效响应。
在火箭弹物体刚体属性选项中,不勾选“Use Gravity”。这样火箭弹不会受重力影响。
创建一个粒子系统:GameObject-Greate Other-Particle System
设定Ellipsoid中x,y,z为0.1
设定Rnd Velocity中每个轴向值设为0.1
粒子发射器Min Size和Max Size都设为0.5
粒子数改为100(Min和Max Emission)
把Effects下smoke拖放到粒子系统中
在粒子动画器部分,设定World Rotation Axis值为0.5
设置变量Size Grow为3
开启粒子系统中Autodestruct选项,这个可以实现火箭弹毁灭后粒子系统也随之消失。
层级面板中,把粒子系统拖拽使其成为火箭弹的子物体。重置粒子系统transform使其位于火箭弹中央,然后再把它的位置设在火箭弹尾部。
在层级栏中选择火箭弹,在场景中四处移动下,看看尾部是否有烟状尾迹。
现在一个带尾迹的火箭弹就制造完毕了,下面可以把火箭弹设定为预制体了。
首先创建一个空预制体(Prefab)来加载火箭弹,命名为“Rocket”
层级栏中选择火箭弹,拖拽至新的“Rocket”预制体
工程栏中创建一个新文件夹,命名为“WeaponPrefabs”,用来存放武器预制物体。


火箭弹脚本Rocket内容如下:


// The reference to the explosion prefab
var explosion : GameObject;
var timeOut = 3.0;
// Kill the rocket after a while automatically
function Start ()

{
     Invoke("Kill", timeOut);
}
函数Kill作用如下,首先找到子层级下的粒子发射器,关闭发射状态。然后,分离被赋予脚本的物体(这里的火箭弹)的任何子物体(例如这里的烟雾尾迹粒子系统)并销毁火箭弹。
function OnCollisionEnter (collision : Collision)

{
      // Instantiate explosion at the impact point and rotate the explosion
      // so that the y-axis faces along the surface normal
      var contact : ContactPoint = collision.contacts[0];
      var rotation = Quaternion.FromToRotation(Vector3.up, contact.normal);
      Instantiate (explosion, contact.point, rotation);
// And kill our selves
      Kill ();
}


function Kill ()
{
      // Stop emitting particles in any children
      var emitter : ParticleEmitter= GetComponentInChildren(ParticleEmitter);
      if (emitter)
            emitter.emit = false;
      // Detach children - We do this to detach the trail rendererer which
      // should be set up to auto destruct
      transform.DetachChildren();
最重要程序的是这句transform.DetachChildren(),它就是预先销毁game Object(这里的火箭弹),这样当火箭弹炸毁时,它的尾迹就不再是它的子物体了。
      // Destroy the projectile
      Destroy(gameObject);
}
@script RequireComponent (Rigidbody)
命令@script确保对被赋予脚本的物体添加一个刚体属性(脚本使用对象要求是刚体)。
一旦火箭弹与另一个带碰撞器的物体发生碰撞,我们希望销毁火箭弹物体。但是如果尾迹是直接关联在火箭弹上面的话,尾迹也会同时被销毁,烟雾会立即消失。因此,就要在销毁火箭弹之前分离子物体尾迹粒子系统。
注意,火箭弹是通过两种方式来销毁,一种是发射后超过3秒自动销毁,二是发生碰撞销毁。
选择火箭发射器
把武器预制文件夹下的火箭弹拖拽放置火箭发射器Projectile参数栏中
运行游戏,当发射火箭弹时,它的尾部应该有一道尾迹了
爆炸(Explosions)
你可能已经注意到了,发射的火箭弹发生碰撞时并没有爆炸产生。下面我们来添加爆炸效果。
把标准资源包中粒子文件夹下的Small Explosion拖拽给火箭弹预制的外部变量Explosion
我们仍然需要定义爆炸的行为,脚本Explosion-Simple内容如下:
var explosionRadius = 5.0;
var explosionPower = 10.0;
var explosionDamage = 100.0;
var explosionTime = 1.0;
function Start ()

{
     var explosionPosition = transform.position;
     var colliders : Collider[] = Physics.OverlapSphere (explosionPosition,explosionRadius);
//返回球半径内碰撞器数列
     for (var hit in colliders)

     {
          if (!hit)
             continue;
          if (hit.rigidbody)
          {
              hit.rigidbody.AddExplosionForce(explosionPower,
              explosionPosition, explosionRadius, 3.0);
这部分对爆炸半径内的所有刚体属性物体一个向上的作用力
这样会使爆炸效果看上去很棒!
              var closestPoint = hit.rigidbody.ClosestPointOnBounds(explosionPosition);
              var distance = Vector3.Distance(closestPoint, explosionPosition);
              // The hit points we apply fall decrease with distance from the hit point
              var hitPoints = 1.0 - Mathf.Clamp01(distance / explosionRadius);
              hitPoints *= explosionDamage;
这部分计算爆炸对每个刚体属性物体造成的毁伤程度。并且毁伤程度随着距爆炸中心地距离而减少。
               // Tell the rigidbody or any other script attached to the hit object
                // how much damage is to be applied!
                hit.rigidbody.SendMessageUpwards("ApplyDamage", hitPoints,
SendMessageOptions.DontRequireReceiver);
这部分是对刚体物体传递一个伤害信息。
            }
       }
       // stop emitting ?
       if (particleEmitter)

       {
             particleEmitter.emit = true;
             yield WaitForSeconds(0.5);
             particleEmitter.emit = false;
        }
        // destroy the explosion
        Destroy (gameObject, explosionTime);
}

把脚本Explosion-Simple付给Small Explosion预制体


这个爆炸脚本可以应用在任何需要爆炸效果的游戏中,要得到特定的效果,只需修改下面几个参数即可:
explosionPower:爆炸威力,移动炸点周围物体的力的大小。
explosionDamage:爆炸造成的毁伤点数。
explosionRadius:爆炸效果范围大小。
这个爆炸脚本与先前初级教程中的那个脚本非常类似,主要的区别就是有了毁伤点数这部分内容。通过变量explosionDamage设置基于距离远近的毁伤点数,外部边缘的物体毁伤程度小于爆炸中心位置的物体。
这意味着现在一个爆炸可以对炸点周围的物体造成伤害。后面我们将讨论如何应用毁伤点数。
运行游戏
机枪(Machine Gun)
类似机枪这样的武器,发射速度比火箭筒快,但造成的伤害小。
创建一个空游戏物体,命名为“机枪”。层级栏中,把这个物体拖放设为“武器”的子物体。
把(Object/weapons/machineGun)机枪模型增加到“机枪”空游戏物体中。
把脚本MachineGun赋予“机枪”游戏物体。
在机枪物体参数栏的变量Muzzle Flash栏中把muzzle_flash(机枪的子物体)付给这个变量。
机枪的脚本如下MachineGun:
var range = 100.0;
var fireRate = 0.05;
var force = 10.0;
var damage = 5.0;
var bulletsPerClip = 40;
var clips = 20;
var reloadTime = 0.5;
private var hitParticles : ParticleEmitter;
var muzzleFlash : Renderer;
private var bulletsLeft : int = 0;
private var nextFireTime = 0.0;
private var m_LastFrameShot = -1;
function Start ()
{
hitParticles = GetComponentInChildren(ParticleEmitter);
// We don't want to emit particles all the time, only when we hit something.
if (hitParticles)
hitParticles.emit = false;
bulletsLeft = bulletsPerClip;
}
函数Start其实就是用来初始化粒子发射器的(bullet spark),设定它开始时为关闭状态。
function LateUpdate()
{
if (muzzleFlash)
{
// We shot this frame, enable the muzzle flash
if (m_LastFrameShot == Time.frameCount)
{
muzzleFlash.transform.localRotation =
Quaternion.AngleAxis(Random.Range(0, 359), Vector3.forward);
muzzleFlash.enabled = true;
if (audio)
{
if (!audio.isPlaying)
audio.Play();
audio.loop = true;
}
}
// We didn't, disable the muzzle flash
else
{
muzzleFlash.enabled = false;
enabled = false;
// Play sound
if (audio)
{
audio.loop = false;
}
}
}
}
执行Update函数后,会自动执行LateUpdate函数。注意,Update函数是在脚本PlayWeapons中调用的,这个脚本配置给了Weapons游戏物体(机枪的父物体)。一般而言,当你想某些效果是在Update函数中调用而相应的效果出现在LateUpdate函数中,就使用LateUpdate函数。例如这个例子,判断玩家“是否开火”(if firing)是在Update函数中,在LateUpdate函数中应用火花效果(muzzle flash)。
function Fire ()
{
     if (bulletsLeft == 0)
        return;
     // If there is more than one bullet between the last and this frame
     // Reset the nextFireTime
    if (Time.time - fireRate > nextFireTime)
       nextFireTime = Time.time - Time.deltaTime;
    // Keep firing until we used up the fire time
    while( nextFireTime < Time.time && bulletsLeft != 0)
    {
        FireOneShot();
        nextFireTime += fireRate;
    }
}
Fire函数是基于机枪发射速度来判断玩家是否能开火。
function FireOneShot ()
{
     var direction = transform.TransformDirection(Vector3.forward);
     var hit : RaycastHit;
     // Did we hit anything?
     if (Physics.Raycast (transform.position, direction, hit, range))
     {
         // Apply a force to the rigidbody we hit
         if (hit.rigidbody)
         hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
         // Place the particle system for spawing out of place where we hit the surface!
         // And spawn a couple of particles
         if (hitParticles)
         {
             hitParticles.transform.position = hit.point;
             hitParticles.transform.rotation =
             Quaternion.FromToRotation(Vector3.up, hit.normal);
             hitParticles.Emit();
         }
         // Send a damage message to the hit object
         hit.collider.SendMessageUpwards("ApplyDamage", damage,
         SendMessageOptions.DontRequireReceiver);
      }
      bulletsLeft--;
      // Register that we shot this frame,
      // so that the LateUpdate function enabled the muzzleflash renderer for one frame
      m_LastFrameShot = Time.frameCount;
      enabled = true;
      // Reload gun in reload Time
      if (bulletsLeft == 0)
         Reload();
}
函数FireOneShot运行时,会在FPS控制器前方发射出一条射线来判断子弹是否击中了什么东西。我们将把子弹的射击距离限定在一定范围内。
如果射线射到某个刚体物体上,就会在那个点上对这个刚体物体产生一定的作用力(因为是机枪,所以作用力很小)。然后在这个点的位置再产生一个火花。粒子发射器方向也会变为沿着这个点的法线方向。
然后,通过对被击中的物体发送一个毁伤信息来对它应用毁伤效果。
function Reload ()

{
     // Wait for reload time first - then add more bullets!
     yield WaitForSeconds(reloadTime);
     // We have a clip left reload
     if (clips > 0)
    {
       clips--;
       bulletsLeft = bulletsPerClip;
     }
}
function GetBulletsLeft ()

{
    return bulletsLeft;
}
函数Reload是来装载一个弹夹(还有弹夹的话)。装载时间可以在参数栏中进行调节。
设置粒子发射器(Configuring the particle emitter)
机枪在其子弹与其他刚体物体发生碰撞时应该有个小火花的效果,下面我们来创建它:
从Standard Assets/Particales文件夹下,把Sparks预制拖放到层级栏中,使其成为machineGun的子物体(不是MachineGun)
搞定!运行游戏。不要忘了1和2是切换武器的。
生命值(Hit Points)
脚本Explosion和MachineGun已经展示了当物体被击中时(火箭弹或子弹),如何设定毁伤程度,并把伤害值传给周围的游戏物体。但是,游戏物体并不知道这些值意味着什么。
游戏物体的健康程度可以通过使用变量hitPoints来进行跟踪。每个物体都有自己的生命值(根据物体自身的生命强度)。每个游戏物体也应该对伤害有所反应并使用了ApplyDamage()函数(注意,这正是Explosion和MachineGun脚本中调用的用来产生伤害函数)。这个函数将会根据伤害程度降低游戏物体的生命值,并在生命值为零时调用其它函数来产生一定的变化(例如死亡或爆炸)。
下一节我们来看看如何使用生命值(hitPoints)和函数ApplyDamage()
爆炸的桶子(Exploding Barrels)
下面的脚本是通用脚本,所以可以作为一个部件加载在任何可以产生毁伤的物体上。DamageReceiver脚本代码如下:
var hitPoints = 100.0;
var detonationDelay = 0.0;
var explosion : Transform;
var deadReplacement : Rigidbody;
function ApplyDamage (damage : float)
{
      // We already have less than 0 hitpoints, maybe we got killed already?
      if (hitPoints <= 0.0)
          return;
      hitPoints -= damage;
      if (hitPoints <= 0.0)
      {
         // Start emitting particles
         var emitter : ParticleEmitter = GetComponentInChildren(ParticleEmitter);
         if (emitter)
             emitter.emit = true;
         Invoke("DelayedDetonate", detonationDelay);
       }
}
函数对被击中或被爆炸影响的物体应用毁伤效果。如果物体生命值已经是0或者更少,不会有任何效果,否则生命数值会根据毁伤效果不断减小。当生命值比零还小的时候就会调用DelayedDetonate函数(延迟只是为了爆炸效果更酷,没别的原因)。
function DelayedDetonate ()
{
BroadcastMessage ("Detonate");
}
这就是引爆游戏物体和其子物体的方法
function Detonate ()
{
// Destroy ourselves
Destroy(gameObject);
// Create the explosion
if (explosion)
Instantiate (explosion, transform.position, transform.rotation);
如果桶子上加载了爆炸预制,那么生命值为0是就会显示这个爆炸预制。
// If we have a dead barrel then replace ourselves with it!
if (deadReplacement)
{
var dead : Rigidbody = Instantiate(deadReplacement, transform.position,
transform.rotation);
// For better effect we assign the same velocity to the exploded barrel
dead.rigidbody.velocity = rigidbody.velocity;
dead.angularVelocity = rigidbody.angularVelocity;
}
如果游戏物体还有一个死亡状态,那么桶子爆炸,然后用这种死亡状态代替这个游戏物体。同时要注意方向的一致性。
// If there is a particle emitter stop emitting and detach so it doesnt get destroyed
// right away
var emitter : ParticleEmitter = GetComponentInChildren(ParticleEmitter);
if (emitter)
{
emitter.emit = false;
emitter.transform.parent = null;
}
}
// We require the barrel to be a rigidbody, so that it can do nice physics
@script RequireComponent (Rigidbody)

下面我们在几个桶子上使用DamageReceiver脚本。先插入一些资源:
拖放Objects/crateAndBarrel/barrel物体到场景中
对桶子(barrel)添加刚体属性
给桶子增加一个盒子碰撞器(box collider)。根据桶子大小调节盒子碰撞器大小。在盒子碰撞器参数栏中的Size中调节。
层级栏中,把脚本DamageReceiver付给桶子
把标准资源库中的explosion预制付给Explosion变量(在桶子的毁伤接收器属性中)
创建一个新预制Barrel(注意大写B,插入的模型桶子名字是小写b)
把设置好的桶子物体(barrel)从层级栏中拖放到工程栏中的新建的预制上
增加几个Barrel到场景(直接复制即可)
运行游戏
你可能注意到,当桶子爆炸后,它仅仅就只消失了,我们还需要添加一个爆炸后的桶子的来代替它。
创建一个新预制Barrel-dead
把原始桶子物体付给预制(从文件夹Objects/crateAndBarrel中导入的)
此时,桶子(Barrel)和爆炸后的桶子(Barrel-dead)看上去是一样的,因为他们的纹理一样(barrel1)
我们需要炸后的桶子纹理跟桶子纹理不一样,这样玩家才知道爆炸没爆炸,类似烧毁的纹理。仅仅调节barrel1是不行的,必须创建一个新的材质付给Barrel-dead。首先复制材质barrel1,调节成烧毁的样子。
工程栏中选择barrel1材质(点击Barrel-dead,在参数Mesh Renderer中点 Materials,然后工程栏中会高亮显示barrel1)
复制材质barrel1(Ctrl+D),重命名为barrelDead。注意,复制的材质会自动命名为barrel2
设定材质,在参数Main Color中把颜色调为黑色
工程栏中选择Barrel-dead,材质栏中下拉菜单选择barrelDead
比较两个材质的不同
下一步,点选Barrel-dead,为其增加盒子碰撞器和刚体属性
把Barrel-dead配置到Barrel的Dead Replacement参数中
运行游戏,将会出现桶子爆炸前后不一样的效果
防卫机枪(Sentry Gun)
最后我们在游戏中增加一个敌人,一挺防卫机枪。防卫机枪将自动寻找玩家,并进行射击。
首先插入机枪模型:
把Object/weapons文件夹下的sentryGun物体拖放到场景中
给机枪增加box collider和rigidbody属性
调节下盒子碰撞器大小,使他包裹炮塔上机枪管
把脚本DamageReceiver付给机枪
现在我们来解释下防卫机枪的脚本代码。全代码如下SentryGun:
var attackRange = 30.0;
var shootAngleDistance = 10.0;
var target : Transform;
function Start () {
if (target == null && GameObject.FindWithTag("Player"))
target = GameObject.FindWithTag("Player").transform;
}
函数Start检测是否给机枪赋予了一个目标物体(参数面板中可以设置),但在参数面板中把Player标签付给参数会更方便(马上来操作)。
function Update () {
if (target == null)
return;
if (!CanSeeTarget ())
return;
// Rotate towards target
var targetPoint = target.position;
var targetRotation = Quaternion.LookRotation (targetPoint - transform.position,
Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation,
Time.deltaTime * 2.0);
如果玩家在游戏中,并被防卫机枪发现,机枪炮塔将从当前角度旋转朝向玩家。
// If we are almost rotated towards target - fire one clip of ammo
var forward = transform.TransformDirection(Vector3.forward);
var targetDir = target.position - transform.position;
if (Vector3.Angle(forward, targetDir) < shootAngleDistance)
SendMessage("Fire");
}
如果当前机枪管位置与玩家的夹角小于shootAngleDistance所设置的数值,机枪将开始开火。
function CanSeeTarget () : boolean
{
if (Vector3.Distance(transform.position, target.position) > attackRange)
return false;
var hit : RaycastHit;
if (Physics.Linecast (transform.position, target.position, hit))
return hit.transform == target;
return false;
}
函数CanSeeTarget计算出机枪是否看见了目标(在这里是玩家)
最后我们来完成对防卫机枪最后的设置:
设置防卫机枪的目标。层级面板中点选FPS控制器,标签栏中的下拉菜单选择标签Player。
把脚本SentryGun配置给防卫机枪的子物体sentryGunRotateY。这会使防卫机枪仅仅顶部旋转,三角基座固定不动。
把爆炸预制配置给机枪中DamageReceiver属性中的爆炸栏
把防卫机枪配置到DamageReceiver属性中的Dead Replacement栏(也可以配置一个自己创建的物体作为破坏状态物体)
把脚本MachineGun付给sentryGunRotateY
在资源库中,把sentryGunTop的子物体muzzleflash配置给机枪属性中的Muzzle Flash变量。
层级栏中点选muzzleflash,把它的着色器类型改为Particles/Additive
运行游戏。现在可以朝油桶和机枪开火了
天空物体(Skybox)
给场景添加天空效果。
    选择Edit>Render Settings。把skyBoxTest拖放配置给Skybox材质。这样就创建了天空。
分享到:
评论

相关推荐

    (Unity源码) 第一人称射击游戏开发模板FPS.rar

    2-117 第一人称射击游戏开发模板FPS2-117 第一人称射击游戏开发模板FPS2-117 第一人称射击游戏开发模板FPS2-117 第一人称射击游戏开发模板FPS2-117 第一人称射击游戏开发模板FPS2-117 第一人称射击游戏开发模板FPS2-...

    FPS 第一人称游戏

    【第一人称射击游戏(FPS)】是一种深受玩家喜爱的游戏类型,它以其强烈的沉浸感和紧张刺激的战斗体验而闻名。HTML5作为一种跨平台、无需安装的网页开发技术,近年来也被广泛应用于游戏开发,其中包括创建第一人称...

    fps fps fps xp fraps 2.6.1

    fps fps fps

    FPS200简单介绍

    2. **小巧封装**:FPS200的尺寸仅为24mm×24mm×2.5mm,这使其能够轻松集成到各种紧凑型设备中。 3. **高分辨率图像**:传感器提供500DPI的高分辨率,能够输出清晰、低噪声的指纹图像,满足精确识别的需求。 4. **...

    FPS_Limiter_0.2

    8. **第三方工具**:FPS_Limiter_0.2是第三方软件,可能不被所有游戏开发商支持。在使用此类工具时,应确保它不会影响游戏的正常运行,避免潜在的兼容性和稳定性问题。 总的来说,FPS_Limiter_0.2提供了一种方便的...

    香港FPS用户操作手册

    2. 使用FPS ID的好处 - 实时转账:无论转账金额大小,FPS都可在几秒钟内完成交易。 - 无需手续费:大部分银行对FPS转账不收取额外费用,降低了支付成本。 - 安全性高:FPS采用先进的安全措施,如双因素认证,确保...

    Unity3d 中文 FPS游戏教程

    Unity3d 中文 FPS游戏教程Unity3d 中文 FPS游戏教程Unity3d 中文 FPS游戏教程

    C51FPS.lib.rar

    keil软件中所需要的C51FPS.LIB. 出现错误提示:*** FATAL ERROR L210: I/O ERROR ON INPUT FILE: EXCEPTION 0021H: PATH OR FILE NOT FOUND FILE: E:\KEIL\C51\LIB\C51FPS.LIB 加入math.h头文件后,因为缺少所...

    FPS.rar_DX fps_FPS_FPS C++_dx fps插件_fps dx

    标题中的“FPS.rar_DX fps_FPS_FPS C++_dx fps插件_fps dx”表明这是一个与DirectX(DX)相关的项目,特别关注帧率(FPS)优化和C++编程。DirectX是由微软开发的一组应用编程接口(APIs),主要用于Windows平台上的...

    FPS射击类游戏第三人称相机控制

    在Unity引擎中,开发一款FPS(First-Person Shooter)射击类游戏时,相机控制和人物移动是游戏体验的关键部分。第三人称视角则为玩家提供了一种观察角色周围环境的额外方式,增强了游戏的沉浸感。以下是对标题和描述...

    SFS2X FPS Tutorial

    标题“SFS2X FPS Tutorial”以及描述“SFS2X游戏服务端搭建结合untiy3D的用户指导手册 希望能给大家一些启示”表明本文档是一份关于如何在SmartFoxServer 2X (SFS2X)游戏服务器上搭建并实现第一人称射击游戏(FPS)的...

    fps200驱动程序

    2. **设备探测**:驱动程序会自动探测系统中是否存在FPS200设备,并为它分配必要的资源。 3. **使用设备文件**:编写用户空间应用程序,通过打开、读写设备文件与指纹模块进行交互。 4. **错误处理**:在应用程序...

    FPS_Tutorial

    《Unity3D第一人称射击游戏(FPS)教程解析》 Unity3D是一款强大的跨平台游戏开发工具,广泛应用于各种游戏类型的制作,其中包括备受玩家喜爱的第一人称射击(FPS)游戏。"FPS_Tutorial"是专门针对Unity3D平台设计的一...

    Unity3D--FPS游戏教程3

    此外,强烈建议在开始之前回顾并实践FPS系列教程的第一和第二部分,因为这部分内容将在此基础上进一步深化。 #### 设置 首先,为了构建更高级的FPS游戏特性,你需要从上一个项目(FPS Tutorial 2)继续工作。这...

    C51FPS.LIB

    如果你在单片机编程的时候出现下面的错误,是因为缺少c51fps.lib文件,把此文件下载后放到D:\KEIL\C51\LIB\C51FPS.LIB即可 *** FATAL ERROR L210: I/O ERROR ON INPUT EXCEPTION 0021H: PATH OR FILE NOT FOUND D...

    fps 优化器

    2. **系统设置优化**:FPS优化器可能会检查并调整操作系统的一些关键设置,例如电源管理计划、屏幕分辨率、桌面主题、窗口模式等,以减少系统对CPU和GPU资源的占用,从而提升游戏性能。 3. **硬件调优**:优化器...

    dx9 fps控制

    2. **时间管理**:为了限制或控制FPS,你需要记录每一帧的开始和结束时间,计算出每帧的渲染时间。这可以通过使用`QueryPerformanceCounter`和`QueryPerformanceFrequency`函数来实现高精度的时间测量。 3. **帧率...

    c51fps.lib

    FILE: E:\KEIL\C51\LIB\C51FPS.LIB ,这是由于虽然math.h这个头文件添加进去了,但是很多朋友装的keil c不是完整版本,缺少c51fps.lib这个进行浮点运算的库文件,下载这个库文件添加keil c的库中就可以编译成功了。

Global site tag (gtag.js) - Google Analytics