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

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;
        }
    }
}
发布了34 篇原创文章 · 获赞 8 · 访问量 6万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览