m0_57965808 2024-06-27 17:27 采纳率: 91.2%
浏览 6
已结题

unity如何同时实现键鼠控制视角与鼠标拖拽物体进行移动。

我在unity写了两个C#脚本,一个是通过键盘鼠标控制移动的,另一个是通过鼠标拖拽移动物体的。但是当通过键盘鼠标控制移动的脚本运行之后,就无法在通过鼠标拖拽移动物体。Unity也没有报错。代码如下,请各位不吝赐教:

using UnityEngine;
//此脚本功能为:通过鼠标拖拽移动游戏场景内的物体
public class DragObject : MonoBehaviour
{
    private bool dragging = false;
    private Vector3 screenPoint;
    private Vector3 offset;

    void OnMouseDown()
    {
        // 当鼠标点击物体时记录屏幕坐标
        screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
        dragging = true;
    }

    void OnMouseUp()
    {
        // 当鼠标释放时停止拖拽
        dragging = false;
    }

    void OnMouseDrag()
    {
        // 当鼠标拖拽时更新物体位置
        if (dragging)
        {
            Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
            gameObject.transform.position = Camera.main.ScreenToWorldPoint(mousePosition) + offset;
        }
    }
}


```c#
using UnityEngine;
/*该程序功能为:通过鼠标键盘实现第一人称视角控制*/

public class FirstPersonController : MonoBehaviour
{
    public float moveSpeed = 5.0f;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    private float rotationY;
    private float rotationX;
    private CharacterController controller;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (Input.GetMouseButton(1))
        {
            rotationX -= Input.GetAxis("Mouse Y") * lookSpeed;/*rotationX-与rotationY+中的减号和加号决定鼠标移动方向最终朝向的视野*/
            rotationY += Input.GetAxis("Mouse X") * lookSpeed;
            rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
            transform.localRotation = Quaternion.Euler(rotationX, rotationY, 0);
            transform.GetChild(0).localRotation = Quaternion.Euler(0, rotationY, 0);
        }

        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        Vector3 moveDir = new Vector3(moveX, 0, moveZ).normalized;
        moveDir = transform.TransformDirection(moveDir);
        moveDir.y = 0;
        controller.Move(moveDir * moveSpeed * Time.deltaTime);
    }
}

```

  • 写回答

2条回答 默认 最新

  • 百锦再@新空间 全栈领域优质创作者 2024-06-27 17:27
    关注

    Gpt辅助回答,我来为你把关

    // 通过键盘鼠标控制视角的脚本
    using UnityEngine;

    public class FirstPersonController : MonoBehaviour { public float moveSpeed = 5.0f;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    private float rotationY;
    private float rotationX;
    private CharacterController controller;

    void Start() { Cursor.lockState = CursorLockMode.Locked;
    controller = GetComponent<
    CharacterController>
    ();
    }
    void Update() { if (Input.GetMouseButton(0)) { rotationX -= Input.GetAxis("
    Mouse Y"
    ) * lookSpeed;
    rotationY += Input.GetAxis("
    Mouse X"
    ) * lookSpeed;
    rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
    transform.localRotation = Quaternion.Euler(rotationX, rotationY, 0);
    transform.GetChild(0).localRotation = Quaternion.Euler(0, rotationY, 0);
    }
    float moveX = Input.GetAxis("
    Horizontal"
    );
    float moveZ = Input.GetAxis("
    Vertical"
    );

    Vector3 moveDir = new Vector3(moveX, 0, moveZ).normalized;
    moveDir = transform.TransformDirection(moveDir);
    moveDir.y = 0;
    controller.Move(moveDir * moveSpeed * Time.deltaTime);
    } }
    // 通过鼠标拖拽移动物体的脚本
    using UnityEngine;

    public class DragObject : MonoBehaviour { private bool dragging = false;
    private Vector3 screenPoint;
    private Vector3 offset;

    void OnMouseDown() { screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
    offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    dragging = true;
    }
    void OnMouseUp() { dragging = false;
    }
    void OnMouseDrag() { if (dragging) { Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    gameObject.transform.position = Camera.main.ScreenToWorldPoint(mousePosition) + offset;
    } } }

    以上是修改后的代码,通过将键盘鼠标控制视角和鼠标拖拽移动物体的脚本分别放在两个不同的物体上,可以在Unity中同时实现这两种功能。希望能够解决你的问题。如果还有其他疑问,请随时提出。


    有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月10日
  • 已采纳回答 7月2日
  • 创建了问题 6月27日