实现效果:
实现代码:
using UnityEngine;
public class PlayerMoveScript : MonoBehaviour
{
public float speed = 5f;
private float angle;
public Rigidbody2D rb;
public Camera cam;
Vector2 player_position; //Value obtained from keyboard
Vector2 mouse_position; //The world coordinate position of the mouse
Vector2 look_At; //The vector pointed by the player towards the mouse
void Update()
{
player_position.x = Input.GetAxisRaw("Horizontal");
player_position.y = Input.GetAxisRaw("Vertical");
mouse_position = cam.ScreenToWorldPoint(Input.mousePosition);
}
private void FixedUpdate()
{
rb.MovePosition(rb.position + player_position * speed * Time.fixedDeltaTime);
//look_At = mouse_position - player_position; //pe Errors caused by using keyboard position as player position
look_At = mouse_position - rb.position;
angle = Mathf.Atan2(look_At.y, look_At.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
test();//Debug测试代码
}
private void test()
{
Debug.Log(angle);
Debug.Log(mouse_position);
Debug.Log(rb.position);
}
}
3代码说明:
3.1移动角色的实现:
声明三个变量一个是speed用来存储可改变速度的大小,一个是rb用来存储目标的刚体,最后一个是player_position用来存储玩家一帧移动的量。然后在update()函数下通过Input类下的GetAxisRaw()方法从键盘获取水平和垂直移动的值(这个值在1,-1之间移动),最后在FixedUpdate()函数下通过rb类中的MovePosition()方法将目标刚体移动到指定位置。其中MovePosition的参数是是下一帧移动的位置,rb.position是目标物体现在的位置,player_position前面说过,speed也说过,Time.fixedDeltaTime我现在也解释不清楚,加了好像可以减轻游戏掉帧导致的瞬间位移问题。
3.2玩家随鼠标旋转的实现:
这里需要一共需要五个变量,rb是之前的目标刚体,这里还需要用到。angle存储z轴旋转角度。cam存储目标摄像机。mouse_position存储鼠标的位置。look_at存储目标刚体指向鼠标的变量。然后在Update()方法中用Input类下的mousePosition获取鼠标位置,这里因为鼠标位置是屏幕坐标需要用cam类下的ScreenToWorldPoint()方法把屏幕坐标转化成世界坐标,在FixedUpdate()方法中用鼠标的世界位置减目标刚体的世界位置放入look_at,用Mathf类中Atan()方法获取向量从x轴开始旋转的角度的弧度,在通过乘以Mathf类中的Rad2Deg把弧度转化为角度,在通过quaternion.Euler()修改游戏对象的旋转。
到这里就结束了,希望对你有帮助。有不对的地方还请大佬多多指教!