Actor walks(角色行走2)

1.修改问题(例如向右走 松手后方向会变回前方),以及警告:

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

public class ActorController : MonoBehaviour {

    public GameObject model;
    public PlayerInput pi;

    [SerializeField]//把Animator暂时显示到unity
    private Animator anim;

	// Use this for initialization
	void Awake () {
        //获取组件
        pi = GetComponent<PlayerInput>();
        anim = model.GetComponent<Animator>();//吃一个模型
	}
	
	// Update is called once per frame
	void Update () {
        //坐标系计算+动画补间旋转
        anim.SetFloat("forward",pi.Dmag);//把Dup的值喂给Animator里面的forwad
        if (pi.Dmag > 0.1f)//增加判断 如果按键时间大于0.1秒那么就不转回到前面
        {
            model.transform.forward = pi.Dvec;
        }
       
	}
}

2.使角色移动:
①.Rigidbody:“刚体” , 不好控制。
②.Charactor Controller :unity 自己制作 不耗能,不是随开随用,可以爬楼梯~不需写代码。

Rigidbody(使角色向前移动):
第一种方法:

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

public class ActorController : MonoBehaviour {

    public GameObject model;
    public PlayerInput pi;

    [SerializeField]//把Animator暂时显示到unity
    private Animator anim;
    private Rigidbody rigid;//Rigidbody 不能在updata中调用 要在Fixedupdata中调用

	// Use this for initialization
	void Awake () {
        //获取组件
        pi = GetComponent<PlayerInput>();
        anim = model.GetComponent<Animator>();//吃一个模型
        rigid = GetComponent<Rigidbody>();
	}
	
	// Update is called once per frame
	void Update () {
        //坐标系计算+动画补间旋转
        anim.SetFloat("forward",pi.Dmag);//把Dup的值喂给Animator里面的forwad
        if (pi.Dmag > 0.1f)//增加判断 如果按键时间大于0.1秒那么就不转回到前面
        {
            model.transform.forward = pi.Dvec;
        }
       
	}
    private void FixedUpdate() //undata是每秒60帧,达到和显示屏一样的刷新速度 而fixedupdata(物理引擎) 每秒50帧
    {
        rigid.position += new Vector3(0, 0, 1.0f) * Time.fixedDeltaTime;//增加一段距离()每秒1个单位
    }


}

第二种方法:

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

public class ActorController : MonoBehaviour
{

    public GameObject model;
    public PlayerInput pi;
    public float WalkSpeed = 2.0f;

    [SerializeField]//把Animator暂时显示到unity
    private Animator anim;
    private Rigidbody rigid;//Rigidbody 不能在updata中调用 要在Fixedupdata中调用
    private Vector3 movingVec;//用于储存玩家意图


    // Use this for initialization
    void Awake()
    {
        //获取组件
        pi = GetComponent<PlayerInput>();
        anim = model.GetComponent<Animator>();//吃一个模型
        rigid = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //坐标系计算+动画补间旋转
        anim.SetFloat("forward", pi.Dmag);//把Dup的值喂给Animator里面的forwad
        if (pi.Dmag > 0.1f)//增加判断 如果按键时间大于0.1秒那么就不转回到前面
        {
            model.transform.forward = pi.Dvec;
        }
        movingVec = pi.Dmag * model.transform.forward*WalkSpeed;//玩家操作存量大小*当下模型正面=玩家意图 把玩家意图存在这个变量里面
    }
    private void FixedUpdate() //undata是每秒60帧,达到和显示屏一样的刷新速度 而fixedupdata(物理引擎) 每秒50帧
    {
        //rigid.position += movingVec * Time.fixedDeltaTime;//增加一段距离()每秒1个单位  速度乘时间来改位移
        rigid.velocity = movingVec;//直接指派速度
    }
}

两种方法区别:第一种是通过速度*时间来改变位移,第二种是直接指派速度内部计算。而且第一种有计算地心引力但是第二种没有计算地心引力。

第二种方法增加地心引力:rigid.velocity = new Vector3(movingVec.x,rigid.velocity.y,movingVec.z);

把玩家操作的控制量给到rigid

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

public class ActorController : MonoBehaviour
{

    public GameObject model;
    public PlayerInput pi;

    [SerializeField]//把Animator暂时显示到unity
    private Animator anim;
    private Rigidbody rigid;//Rigidbody 不能在updata中调用 要在Fixedupdata中调用
    private Vector3 movingVec;//用于储存玩家意图


    // Use this for initialization
    void Awake()
    {
        //获取组件
        pi = GetComponent<PlayerInput>();
        anim = model.GetComponent<Animator>();//吃一个模型
        rigid = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //坐标系计算+动画补间旋转
        anim.SetFloat("forward", pi.Dmag);//把Dup的值喂给Animator里面的forwad
        if (pi.Dmag > 0.1f)//增加判断 如果按键时间大于0.1秒那么就不转回到前面
        {
            model.transform.forward = pi.Dvec;
        }
        movingVec = pi.Dmag * model.transform.forward;//玩家操作存量大小*当下模型正面=玩家意图 把玩家意图存在这个变量里面
    }
    private void FixedUpdate() //undata是每秒60帧,达到和显示屏一样的刷新速度 而fixedupdata(物理引擎) 每秒50帧
    {
        rigid.position += movingVec * Time.fixedDeltaTime;//增加一段距离()每秒1个单位
    }
}




3.为什么会出现滑步现象以及如何解决:
⭐因为物理的坐标移动和动画播放速度不一致,可以通过改物理坐标移动速度达到动画播放和坐标移动一致。

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

public class ActorController : MonoBehaviour
{

    public GameObject model;
    public PlayerInput pi;
    public float WalkSpeed = 2.0f;

    [SerializeField]//把Animator暂时显示到unity
    private Animator anim;
    private Rigidbody rigid;//Rigidbody 不能在updata中调用 要在Fixedupdata中调用
    private Vector3 movingVec;//用于储存玩家意图


    // Use this for initialization
    void Awake()
    {
        //获取组件
        pi = GetComponent<PlayerInput>();
        anim = model.GetComponent<Animator>();//吃一个模型
        rigid = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //坐标系计算+动画补间旋转
        anim.SetFloat("forward", pi.Dmag);//把Dup的值喂给Animator里面的forwad
        if (pi.Dmag > 0.1f)//增加判断 如果按键时间大于0.1秒那么就不转回到前面
        {
            model.transform.forward = pi.Dvec;
        }
        movingVec = pi.Dmag * model.transform.forward*WalkSpeed;//玩家操作存量大小*当下模型正面=玩家意图 把玩家意图存在这个变量里面
    }
    private void FixedUpdate() //undata是每秒60帧,达到和显示屏一样的刷新速度 而fixedupdata(物理引擎) 每秒50帧
    {
        rigid.position += movingVec * Time.fixedDeltaTime;//增加一段距离()每秒1个单位
    }
}

4.斜方向行走会比直方向行走更快:
⭐在playinput中计算Dmag的时候dup和dright都带成1的话算出的Dmag将是根号2约等于1.414…

猜你喜欢

转载自blog.csdn.net/weixin_44025382/article/details/84944826