目录

物理学移动

实现角色移动

C# 代码

Unity中操作

实现小怪追主角

C#代码

Unity操作

通过组件的方式去移动

C#代码


物理学移动

我们使用的是刚体受力会移动的物理学观点去实现角色的移动的。

当物体受力时就会向某一个方向移动其中的Time.fixedDeltaTime是物理引擎的渲染时间间隔为0.02s即每秒50帧

实现角色移动

C# 代码

using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayMovementController : MonoBehaviour{    public float moveSpeed = 3.0f;    private Vector2 movDir = new Vector2();    //物理引擎方式采用的参数    public Transform target;    private Rigidbody2D rb2D;    // Start is called before the first frame update    void Start()    {        rb2D = GetComponent();    }    // Update is called once per frame    void Update()    {        MoveCharacter();    }    private void MoveCharacter()    {        movDir.x = Input.GetAxisRaw("Horizontal");        movDir.y = Input.GetAxisRaw("Vertical");        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2        //归一化处理        movDir.Normalize();        //角色移动,要在Unity页面的target栏拖入需要移动的物体。        rb2D.position += movDir * moveSpeed * Time.fixedDeltaTime;//这句代码也行!! rb2D.MovePosition(new Vector2(transform.position.x, transform.position.y)+movDir*moveSpeed*Time.fixedDeltaTime);     }}

防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
归一化处理

角色移动,要在Unity页面的target栏拖入需要移动的物体

Unity中操作

实现小怪追主角

就是一个物体追随另一个物体,这里演示主角追建筑

C#代码

using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayMovementController : MonoBehaviour{    public float moveSpeed = 3.0f;    private Vector2 movDir = new Vector2();    //物理引擎方式采用的参数    public Transform target;    private Rigidbody2D rb2D;    // Start is called before the first frame update    void Start()    {        rb2D = GetComponent();    }    // Update is called once per frame    void Update()    {        MoveCharacter();    }    private void MoveCharacter()    {        movDir.x = Input.GetAxisRaw("Horizontal");        movDir.y = Input.GetAxisRaw("Vertical");        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2        //归一化处理        movDir.Normalize();                //角色向某个位置移动(不是受控制的移动)可以实现跟随或小怪追主角        transform.position = Vector2.MoveTowards(transform.position,target.position,Time.deltaTime);    }}

防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
归一化处理
角色向某个位置移动(不是受控制的移动)可以实现跟随或小怪追主角

Unity操作

选中角色并上锁

通过组件的方式去移动

这个最简单的,我们通过获取当前位置直接计算出下一帧的位置,然后直接更改角色在下一个位置即可。

C#代码

using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayMovementController : MonoBehaviour{    public float moveSpeed = 3.0f;    private Vector2 movDir = new Vector2();    // Start is called before the first frame update    void Start()    {            }    // Update is called once per frame    void Update()    {        MoveCharacter();    }    private void MoveCharacter()    {        movDir.x = Input.GetAxisRaw("Horizontal");        movDir.y = Input.GetAxisRaw("Vertical");        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2        //归一化处理        movDir.Normalize();        //角色移动,Time.deltaTime表示渲染每帧的时间约等于(1/FPS)为了适配不同帧率的电脑,moveSpeed是角色移动的速度        transform.position += new Vector3(movDir.x,movDir.y,0.0f)*moveSpeed*Time.deltaTime;    }}

public class Transform : Component, IEnumerable
{
private class Enumerator : IEnumerator
{
private Transform outer;

private int currentIndex = -1;

public object Current => outer.GetChild(currentIndex);

internal Enumerator(Transform outer)
{
this.outer = outer;
}

public bool MoveNext()
{
int childCount = outer.childCount;
return ++currentIndex < childCount;
}

public void Reset()
{
currentIndex = -1;
}
}

//
// 摘要:
// The world space position of the Transform.