目录
物理学移动
我们使用的是刚体受力会移动的物理学观点去实现角色的移动的。
当物体受力时就会向某一个方向移动其中的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<Rigidbody2D>();
}
// 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<Rigidbody2D>();
}
// 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.