Unity2D游戏开发 角色跟随指针旋转实现

该代码示例展示了在Unity中如何使用C#脚本来实现角色基于键盘移动以及朝向鼠标位置旋转。通过Rigidbody2D进行物理移动,利用Camera将屏幕坐标转换为世界坐标,然后计算角度进行旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现效果:

 实现代码:

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()修改游戏对象的旋转。

到这里就结束了,希望对你有帮助。有不对的地方还请大佬多多指教!

### 如何在 Unity3D 中进行控制相关的开发 #### 使用输入管理器实现玩家移动控制 为了使游戏角色能够响应用户的键盘或鼠标操作,在 Unity3D 中通常会通过 `Input` 类来获取这些事件并据此更新角色的位置或其他属性。下面是一个简单的 C# 脚本例子,展示了如何让一个物体根据 WASD 或方向键来进行平移运动[^1]。 ```csharp using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed = 5f; // 移动速度 void Update() { float moveHorizontal = Input.GetAxisRaw("Horizontal"); float moveVertical = Input.GetAxisRaw("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); transform.Translate(movement * speed * Time.deltaTime); } } ``` 此脚本应附加到想要被控制的游戏对象上,并设置合适的移动速度参数。当运行场景时,按住 W/A/S/D 键或者箭头键可以改变该物体的方向和位置。 #### 实现基于鼠标的视角旋转控制 对于第一人称射击类游戏而言,允许玩家利用鼠标调整摄像机的角度是非常重要的特性之一。这里给出一段用于处理此类交互逻辑的基础代码片段: ```csharp using UnityEngine; public class MouseLook : MonoBehaviour { private float _mouseSensitivity = 2f; private float _xRotation = 0f; void Start(){ Cursor.lockState = CursorLockMode.Locked; // 锁定光标 } void LateUpdate(){ float mouseX = Input.GetAxis("Mouse X") * _mouseSensitivity; float mouseY = Input.GetAxis("Mouse Y") * _mouseSensitivity; _xRotation -= mouseY; _xRotation = Mathf.Clamp(_xRotation, -90f, 90f); transform.Rotate(Vector3.up * mouseX); Camera.main.transform.localRotation = Quaternion.Euler(_xRotation, 0f, 0f); } } ``` 上述代码实现了锁定鼠标指针的功能,并使得相机跟随鼠标的水平与垂直位移而转动。这有助于创建更加沉浸式的用户体验。 #### 添加跳跃机制 为了让角色具备跳跃能力,可以在之前的移动脚本基础上增加如下几行代码: ```csharp if (Input.GetKeyDown(KeyCode.Space)){ GetComponent<Rigidbody>().AddForce(new Vector3(0, jumpPower, 0), ForceMode.Impulse); } ``` 这段额外的条件语句会在检测到空格键按下时给刚体施加向上的冲力,从而模拟跳起的效果。需要注意的是,要确保目标对象已经挂载了 Rigidbody 组件以便物理引擎正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值