Unity Tutorial - Survival Shooter

Unity Tutorial - Survival Shooter


02-Player Character

第一章主要目的是控制 player 的行动,以及控制 player 在不同状态下的动画效果。

首先是行动,这次控制角色移动实现和 Tanks 中稍有不同,这个游戏使用鼠标来控制角色转向,如何用鼠标来实现控制角色转向呢,来看下面这段代码

        void Turning ()
        {
            // Create a ray from the mouse cursor on screen in the direction of the camera.
            Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);

            // Create a RaycastHit variable to store information about what was hit by the ray.
            RaycastHit floorHit;

            // Perform the raycast and if it hits something on the floor layer...
            if(Physics.Raycast (camRay, out floorHit, camRayLength, floorMask))
            {
                // Create a vector from the player to the point on the floor the raycast from the mouse hit.
                Vector3 playerToMouse = floorHit.point - transform.position;

                // Ensure the vector is entirely along the floor plane.
                playerToMouse.y = 0f;

                // Create a quaternion (rotation) based on looking down the vector from the player to the mouse.
                Quaternion newRotatation = Quaternion.LookRotation (playerToMouse);

                // Set the player's rotation to this new rotation.
                playerRigidbody.MoveRotation (newRotatation);
            }
        }

里面的主要逻辑是从 camera 向当前鼠标位置发出一条射线,声明一个 RaycasetHit 类型变量 floorHit 来储存被射线射中的信息,使用 Physics.Raycast() 方法来确认射线是否与 Floor 这个 Layer 相交,如果是,则将相交点的位置减去当前 player 的位置,得到一个由 player 指向鼠标点的方向的向量,同时置其方向的向量在 y 轴的值为零,保证该向量是水平的。有了方向的向量,我们需要将这个向量转化成 Roatation,这里使用到了 Quaternion.LookRotation() 来转化。剩下的就是使用样子和 Rigidbody.MovePosition() 非常像的 Rigidbody.MoveRotation 来平滑地实现移动和旋转。

  • 整个脚本还有一个小细节需要注意的地方,这次使用的是 Input.GetAxisRaw 而不是之前在 Tanks 中我们熟悉的 Input.GetAxis ,这两个方法主要不同的地方在于 Input.GetAxisRaw 的返回值只有三个 {-1, 0, 1}Input.GetAxis 的返回值则在 [-1, 1) 之间。这样的改动在游戏里的意义就是 player 将在你按下移动键就会以一个 full speed 行动,而不是慢慢地增长到 full speed

另外,本章还有一个第一次接触到的知识点,Animator,通过在 Animator 中有限状态机,创建并设定状态转换条件,使我们第一次游戏中可以让 player 在不同状态下有不同的动作从而显得更加有灵性。

使用 Animator 的方法很简单,首先新建 Assets -> Create -> Animation Controller 将其命名为 PlayerAC ,随即将它拖到 player 里面,接着在 Assets 中双击将其打开。此时会出现一个名为 Animator 的新窗口,像这样:

Animator窗口

接着只需将官方预先给我们准备好放在 Models 中的动画拖拽建立连接可得到上图。此外我们还需要设定两个变量来控制状态之间的相互转换,分别是:bool IsWalking 以及 Trigger Die ,最后在脚本中更新变量就可以完成游戏里 player 的状态转换了!

    void Animating(float h, float v){
        // Create a boolean that is true if either of the input axes is non-zero
        bool walking = h != 0f || v != 0f;

        // Tell the animator whether or not the player is walking 
        anim.SetBool ("IsWalking", walking);
    }
  • 注意 :这时运动游戏查看会发现,player 的动作很不连贯,该 Move 的时候却经常还是 Idle ,其原因是每一个作画都是有时间的,仔细看可以发现 Idle 动画时间长达 12.5s 而 Move 动作只有短短 0.8s ,此时,每一次状态转换,都要等 Idle 播放完 Move 才会播放,自然 player 就会该动也偷懒不动啦

Idle

Move

解决方法很简单,只需在状态转换的属性页中 uncheck Has Exit Time 即可

uncheck Has Exit Time


03 - Camera Setup

本章的 Camera 的设置相比 Tanks 中的设置要简单一些,这里简单的先将 Camera 设到一个比较好观察到 player 的视角,不意外的,将脚本中使用一个 Vector3 变量在 Start() 方法中将 Camera 和 player 当前的向量差储存起来,再于 FixedUpdate() 中将 Camera 的位置更新为 Player 位置加上该向量差。

public class CameraFollow : MonoBehaviour
{
    public Transform target;            // The position that that camera will be following.
    public float smoothing = 5f;        // The speed with which the camera will be following.

    Vector3 offset;                     // The initial offset from the target.

    void Start ()
    {
        // Calculate the initial offset.
        offset = transform.position - target.position;
    }

    void FixedUpdate ()
    {
        // Create a postion the camera is aiming for based on the offset from the target.
        Vector3 targetCamPos = target.position + offset;

        // Smoothly interpolate between the camera's current position and it's target position.
        transform.position = Vector3.Lerp (transform.position, targetCamPos, smoothing * Time.deltaTime);
    }
}

04 - Create Enemy #1

这一节来创建 enemy ,游戏中一共有三个不同类型的 enemy 首先我们从 Zombunny 类型的开始,和 player 开始一样的操作,将他从 models 拖拽到 scene 中并添加一系列的组件,包括 RigidbodyAnimation Controller 等等,这里为 Zombunny 添加了一个 Capsule Collider 作为物理上的碰撞机,又添加了一个 Sphere Collider 作为触发器触发后面对 player 造成伤害的事件。

然而,本节的真正重点其实是 unity 自带的 Navigation 。从游戏中需要的功能说起,我们需要游戏中的 enemy 会自动的向 player 靠近从而对玩家造成伤害,然而问题在于我们如何让 enemy 自动绕过障碍,又足够智能地不会和其他的 enemy 相互碰撞,还能选择最近的路来向 player 靠近呢,这里就需要 unity 的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Mega-Fiers是一款强大的Unity插件,它为开发者提供了许多功能和工具,以帮助他们创建优秀的游戏体验。 首先,Unity Mega-Fiers具有强大的形变功能。开发者可以通过该插件实现各种形状的变换,包括弯曲、挤压、拉伸等。这为游戏中的人物、物体和环境提供了更多的自由度和个性化选项,使其更具动态和真实感。 其次,Unity Mega-Fiers还提供了高度的粒子系统控制能力。开发者可以使用该插件来创建更加逼真的粒子效果,并具有更准确的控制。这包括粒子的大小、颜色、速度等方面,使游戏中的特效更加出色。 另外,Unity Mega-Fiers还支持可编程网格。这意味着开发者可以通过脚本来控制网格的生成和变形,从而实现各种复杂的效果。无论是地形生成、水体模拟还是其他物体的变形,都可以通过该插件实现,并使游戏更加逼真和具有个性化。 除了以上功能,Unity Mega-Fiers还提供了其他诸多辅助工具,如动画控制、特效编辑等,为开发者提供了更丰富的开发选项和提升游戏质量的手段。 总结而言,Unity Mega-Fiers是一款功能强大的Unity插件,为开发者提供了丰富的形变、粒子系统控制和可编程网格等功能。它能够大幅提升游戏的真实感和品质,并为开发者提供更多的创作空间和个性化选项。无论是初学者还是有经验的开发者,都能够从中受益,并创造出出色的游戏作品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值