关闭

Unity3D 控制角色移动,转向和自动跟随

标签: unity3d人物自动跟随
2657人阅读 评论(0) 收藏 举报
分类:

Unity3D 角色转向和自动跟随

通过挂载脚本控制3D人物的移动和转向,先上一个官方的例子:

这里写图片描述

这里只有转向而没有移动的方法,看了下原工程,移动是做在动画中的,只要执行了动画就会跟着移动,而且每迈出一步的距离是固定的。如果移动没有做在动画里只要像旋转一样添加一个位移的变化就行了,下面是自己的例子:

代码块

以下例子仅记录下大致的方法,尚需测试,这里可以处理多个按键同时按下的情况:

using UnityEngine;

public class MoveInput
{
    bool presskey ;

    void Update() 
    {
        presskey = false;
        if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsWebPlayer)
        {

            bool keyboard = true;
            if (keyboard)
            {
                int x = 0;
                int y = 0;
                if (Input.GetKey(KeyCode.A))
                {
                    x -= 1;
                }
                if (Input.GetKey(KeyCode.D))
                {
                    x += 1;
                }
                if (Input.GetKey(KeyCode.S))
                {
                    y -= 1;
                }
                if (Input.GetKey(KeyCode.W))
                {
                    y += 1;
                }
                if (!GameApp.Instance().IsAutoFight() || x!=0 || y!=0 || NoTarget())
                {
                    bAutomove = false;
                    Dir2 = new Vector2(x, y);
                }
                if (x != 0 || y != 0)
                {
                    presskey = true;
                    PlayerMove(Dir2);
                }
            }
        }
    }

    void PlayerMove(Vector2 direction)
    {
        float offsetX = direction.x * Time.deltaTime * _moveToSpeed;
        float offsetY = direction.y * Time.deltaTime * _moveToSpeed;
        transform.position = new Vector3(transform.position + offsetX , 0, transform.position + offsetY );
    }
}

有时候会有一些自动跟随的需要,比如宠物跟着主角走,思路就是将主角的空间位置设置为移动目标,通过update里的迭代去接近目标,朝向也是同样处理,朝向上的接近使用:Quaternion.Slerp(self.transform.rotation, target.transform.rotation, Time.deltaTime * dirSpeed);
移动上的接近使用:Vector3.MoveTowards(self.transform.position, target.transform.position, Time.deltaTime * moveSpeed);
如果要让跟随更自然一些,可以在主角移动,每次转向的时候传给宠物一个目标,宠物按顺序将这些目标位置存放在一个列表里,按照列表里的顺序移动,就像重走了一遍主角的路线一样。

代码块

宠物跟随示例,这里仅展示下大致方法:

using UnityEngine;

public class PetMovement : BaseMovement
{
    void Update()
    {
        Player ownerPlayer = pet.OwnerPlayer;
        GameObject target = GetTarget(ownerPlayer );
        if (target != null)
        {
            float distance = Vector3.Distance(transform.position, target.transform.position);
            PetInfo petInfo = GetPetInfo(pet.ID);
            var dir = target.transform.position - transform.position;
            int skillRange = petInfo.skillRange;
            if (skillRange < distance) //  当和主人之间的距离超过技能距离时跟随
            {
                Action.ChangeAction(CAction.RunFront);// 改变动画
                var destPos = transform.position + dir.normalized * (distance - skillRange + 1);
                transform.position = Vector3.MoveTowards(transform.position, destPos, Time.deltaTime * move_Speed);
            }
            var rotation = Quaternion.LookRotation(dir); //  获得 目标方向
            transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 5);  // 差值  宠物朝向趋向目标
            return;
        }
    }
}
0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39503次
    • 积分:732
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:8篇
    • 译文:1篇
    • 评论:6条
    文章分类
    最新评论