using UnityEngine;

public class SpawnAndMove : MonoBehaviour
{
    public GameObject prefab; // 预制体
    public float moveSpeed = 5f; // 移动速度

    private Camera mainCamera;
    private bool isMoving = false;

    private void Start()
    {
        mainCamera = Camera.main;
    }

    private void Update()
    {
        // 鼠标右键按下时生成预制体并开始移动
        if (Input.GetMouseButtonDown(1))
        {
            Vector3 spawnPosition = GetSpawnPosition();
            if (spawnPosition != Vector3.zero)
            {
                GameObject newObject = Instantiate(prefab, spawnPosition, Quaternion.identity);
                StartCoroutine(MoveToMousePosition(newObject));
            }
        }
    }

    // 获取生成预制体的位置
    private Vector3 GetSpawnPosition()
    {
        Vector3 spawnPosition = Vector3.zero;

        // 获取鼠标右键位置
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = mainCamera.transform.position.y;

        // 将屏幕坐标转换为世界坐标
        Vector3 worldPosition = mainCamera.ScreenToWorldPoint(mousePosition);

        // 计算生成位置
        Vector3 cameraForward = mainCamera.transform.forward;
        Vector3 cameraRight = mainCamera.transform.right;
        float spawnDistance = 1f; // 生成距离相机的距离
        spawnPosition = worldPosition + (spawnDistance * cameraForward) - (spawnDistance * cameraRight);

        return spawnPosition;
    }

    // 协程:移动预制体到鼠标右键位置
    private System.Collections.IEnumerator MoveToMousePosition(GameObject obj)
    {
        isMoving = true;

        // 获取鼠标右键位置
        Vector3 targetPosition = GetMousePosition();

        // 移动预制体
        while (Vector3.Distance(obj.transform.position, targetPosition) > 0.01f)
        {
            obj.transform.position = Vector3.MoveTowards(obj.transform.position, targetPosition, moveSpeed * Time.deltaTime);
            yield return null;
        }

        // 销毁预制体
        Destroy(obj);

        isMoving = false;
    }

    // 获取鼠标右键位置
    private Vector3 GetMousePosition()
    {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = mainCamera.transform.position.y;
        return mainCamera.ScreenToWorldPoint(mousePosition);
    }
}

代码解析:

  1. Update()函数中,通过Input.GetMouseButtonDown(1)判断鼠标右键是否按下,如果按下则生成预制体并开始移动。
  2. GetSpawnPosition()函数根据鼠标右键位置计算生成预制体的位置,这里选择的是鼠标右键位置的左斜上方,距离相机一定的距离。
  3. MoveToMousePosition()协程用于将预制体移动到鼠标右键位置,通过Vector3.MoveTowards()实现平滑移动,直到达到目标位置。
  4. 在协程中,使用yield return null实现每帧更新一次位置。
  5. 在预制体到达目标位置后,调用Destroy()函数销毁预制体。
  6. GetMousePosition()函数用于获取鼠标右键的世界坐标位置
unity脚本鼠标右键后在右键的左斜上方靠近相机边缘位置生成一个预制体然后向鼠标右键位置移动到达位置后销毁使用协程来完成添加注释

原文地址: https://www.cveoy.top/t/topic/h690 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录