目录
物理学移动
实现角色移动
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.