unity实现人物在场景中的移动(360度移动、跳跃、攻击出现火光)(第二天)

432 阅读4分钟

1.导入资源包

image.png

2.将人物拖入场景中(配置新人物)

image.png

为了方便测试新人物,我们将第一天测试的人物隐藏,取消打钩

1.将新人物命名为player2,并将标签选择player

2.给player2添加角色控制器

斜度设置为90度,可以实现较大幅度的跳跃,和针对于坡度较小的地形可以直接走过去 设置y轴中心为0.95,半径为0.4,高度设置为1.9,保持当前人物的胶囊体和地面刚好接进

注意:在这里我们采用不添加刚体的方式实现不碰墙的效果

image.png

3.配置player2的动画器

将上次设置好的player设置的动画器拖入到player2的控制器源中去 今天实现的效果类似于第一天实现的效果,所以我们在这里直接采用昨天设置的动画域

image.png

4.编写character脚本文件

并将脚本文件挂载到player2人物身上

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class character : MonoBehaviour
{
    // 先获取到角色控制器
    CharacterController player;
    //获取动画控制器
    Animator ani;
    //垂直虚拟轴
    float z;
    //水平虚拟轴
    float x;
    //获取鼠标偏移量
    float mouseX = 0;
    //需要有一个速度  speed;
    private float speed = 0f;
    //记录左右动作状态
    int xSpeed = 0;
    //加速度次数
    int i = 0;
    //加速度
    public float a = 0.03f;
    //有一个最大值
    public float maxZ = 6;
    //向上的加速度
    float ay = 0f;
    float playerY = 0f;
    public float maxHeight = 1f;

    //技能特效
    public GameObject fireAttack;
    void Start()
    {
        //拿到角色控制器和动画控制器
        player = GetComponent<CharacterController>();
        ani = GetComponent<Animator>();
        //隐藏鼠标
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {

        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");

        if (x != 0 || z != 0)  //说明按下了按键
        {
            //往前走,正常是慢走,按住shift的时候会变为快跑,最大速度是8,过程是逐渐加速至最大值
            //普通速度

            //奔跑速度 按下shift加速 加速的时候从2开始加速,然后到8的时候停止

            if (Input.GetKey(KeyCode.LeftShift) && z > 0)
            {
                i++;
                speed = speed >= maxZ ? maxZ : 2 + i * a;
            }
            else
            {
                i = 0;
                speed = z;
            }
            //因为x是浮点类型,我们程序需要的是int类型,所以我们需要临时变量转化一下

            xSpeed = x > 0f ? 1 : -1;//切换xSpeed的值
        }

        //没有添加刚体的情况下也能不会碰墙

        //往z轴x轴的方向移动--x、z变化的值;
        player.SimpleMove(transform.forward * speed + transform.right * x); //重力效果
        //获取鼠标水平偏移量
        mouseX = Input.GetAxis("Mouse X");
        //改变旋转 
        transform.Rotate(Vector3.up * mouseX * 10);

        //在外面更改值,按下设置xSpeed值,松开也要设置值为0
        ani.SetFloat("speed", speed);
        if (x == 0f) xSpeed = 0;
        ani.SetInteger("xSpeed", xSpeed);
        //判断是否按下空格键 切换跳跃动作 怎么判断是不是离地了
        //player.isGrounded判断是否落地了,落地了才能继续跳
        if (Input.GetKeyDown(KeyCode.Space) && ani.GetCurrentAnimatorStateInfo(0).IsTag("changetojump") && player.isGrounded)  //还要判断当时没有在播放跳跃动画
        {
            playerY = transform.position.y; //跳跃的时候的y初始值
            ani.SetTrigger("jump"); //播放跳跃的动画
            ay = 0.15f; //给它一个跳跃的加速度
        }
        //限制跳跃的最高高度为1--也就是说y值到1的时候下落
        if (transform.position.y - playerY > maxHeight)
        {
            ay = 0;
        }
        //每一次更改position的值
        if (ay != 0f) transform.position += transform.up * ay;

        if (Input.GetMouseButtonDown(0)) //鼠标左键按下的时候
        {
            Debug.Log("鼠标左键点击");
            //切换attack的值
            ani.SetTrigger("attack");

        }

    }
    //编写事件的方法
    public void attack(GameObject fireAttack)
    {
        Debug.Log("发射光");
        //攻击的时候同时释放技能  克隆技能
        GameObject clone = Instantiate(fireAttack,
            new Vector3(transform.position.x, transform.position.y + 1, transform.position.z),
            transform.rotation);

        //clone.transform.Rotate(Vector3.right, -90);
    }
}

5.粒子系统作为对象

将新建好的粒子系统拖入左侧assets项目中,并以前原来被拖的地方的粒子系统删除,可以防止在原来的3D窗口中消失

注意点:在粒子系统fire配置中尽量不要旋转它,因为在后续脚本文件控制方向的话会很麻烦,当我们发现操控代码旋转的方向不对的时候,我们这时候要查看一下是否在untiy配置的时候把原物体旋转了,可以在transform里面查看或者在粒子系统配置中的形状里面进行查看

image.png

6.新建fireAttack脚本文件

并将新建好的fireAttack挂载到fire粒子系统上

fireAttack脚本文件主要实现的作用是控制攻击的火光移动的方向和移动的速度

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class fireAttack : MonoBehaviour
{
    // 一旦火被激活,那么它就要往z轴方向移动
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //往z轴方向,往前移动
        transform.position += transform.forward * 10*Time.deltaTime;
    }
}

并将在character脚本文件中attack方法放入攻击动画中,并将设置好的粒子系统作为对象插入Object源中

image.png

    if (Input.GetMouseButtonDown(0)) //鼠标左键按下的时候
        {
            Debug.Log("鼠标左键点击");
            //切换attack的值
            ani.SetTrigger("attack");

        }
        

当鼠标左键按下的时候,就会触发动画器中的atta变量值,通过这个值我们就可以控制是否攻击,同时触发attack方法,对火花进行克隆,Instantiate()传入克隆的对象、人物的大概位置的基础上在改善(因为火光是从人物发出来的)、人物的旋转(火光会根据人物的旋转进行发射)

    public void attack(GameObject fireAttack)
    {
        Debug.Log("发射光");
        //攻击的时候同时释放技能  克隆技能
        GameObject clone = Instantiate(fireAttack,
            new Vector3(transform.position.x, transform.position.y + 1, transform.position.z),
            transform.rotation);

    }

7.最终效果:

人物的攻击2.gif