首页 > 其他分享 >unity3d拼图__附带资源

unity3d拼图__附带资源

时间:2024-08-31 16:24:43浏览次数:10  
标签:__ unity3d 鼠标 拼图 GameObject Vector3 position selectedObject

要达到吸附效果则需要每个拼图上挂载碰撞体

达到整张图片的替换效果需要选中所有拼图部件把材质球拖上去

制作材料球

脚本挂载到随便一个空物体上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PinTu : MonoBehaviour
{
    // 记录有没有拼图被选中
    private GameObject selectedObject;

    // 拼图预制体
    GameObject[] dragObj;
    // 记录拼图应该放的点
    GameObject[] dropObj;
    // Start is called before the first frame updateq
    void Start()
    {
        dragObj = GameObject.FindGameObjectsWithTag("drag");
        dropObj = GameObject.FindGameObjectsWithTag("drop");

        foreach (var item in dragObj)
        {
            item.transform.position = new Vector3(Random.Range(-0.2f, 0.3f), 0.815f, Random.Range(-0.1f,0.4f));
        }
    }

    // Update is called once per frame
    void Update()
    {
        // 如果按下了鼠标左键
        if (Input.GetMouseButtonDown(0))
        {
            // 选中的物体为空
            if (selectedObject == null)
            {
                // 存储的射线信息
                RaycastHit hit = CastRay();
                // 碰到的物体有碰撞器
                if (hit.collider != null)
                {
                    // 如果标签不是drag直接返回
                    if (!hit.collider.CompareTag("drag"))
                    {
                        return;
                    }
                    // 碰到的物体标签是--drag,为selectedObject赋值
                    selectedObject = hit.collider.gameObject;
                    // 设置鼠标光标不可见
                    Cursor.visible = false;
                }
            }

            // 选中物体之后,再按一下鼠标左键---放下物体
            else
            {
                // 记录鼠标点击的点
                Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.WorldToScreenPoint(selectedObject.transform.position).z);
                Vector3 worldPosition = Camera.main.ScreenToWorldPoint(position);

                #region  吸附
                //遍历每个放置点,找到和鼠标点击最近的点
                Vector3 tmpdrop = Vector3.zero;
                float minDistance = 10.0f;
                foreach (var item in dropObj)
                {
                    if (Vector3.Distance(item.transform.position, worldPosition) <= minDistance)
                    {
                        minDistance = Vector3.Distance(item.transform.position, worldPosition);
                        tmpdrop = item.transform.position;
                    }
                }
                // 如果最小距离小于---限定值,说明在拼图位置上,就赋值,否则就是鼠标位置
                if (minDistance < 0.04f)
                {
                    // 赋值
                    selectedObject.transform.position = tmpdrop + new Vector3(0, 0.003f, 0);

                }
                else
                {
                    selectedObject.transform.position = worldPosition;
                }
                #endregion
                //selectedObject.transform.position = worldPosition;
                selectedObject = null;
                Cursor.visible = true;
            }
        }



        // 如果selectedObject不为空,说明点击到了物体,物体跟随鼠标移动
        if (selectedObject != null)
        {
            // position存储的是鼠标的x,y坐标,自身的z坐标---屏幕坐标
            Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.WorldToScreenPoint(selectedObject.transform.position).z);
            // 将屏幕坐标,转换为世界坐标
            Vector3 worldPosition = Camera.main.ScreenToWorldPoint(position);
            // 为选中的物体赋值--这里的y是固定的0.25
            selectedObject.transform.position = new Vector3(worldPosition.x, 0.811f, worldPosition.z);

            // 按下鼠标的右键,旋转
            if (Input.GetMouseButtonDown(1))
            {
                selectedObject.transform.rotation = Quaternion.Euler(new Vector3(
                    selectedObject.transform.rotation.eulerAngles.x,
                    selectedObject.transform.rotation.eulerAngles.y + 90f,
                    selectedObject.transform.rotation.eulerAngles.z));
            }
        }
    }
    // 返回射线碰撞信息
    private RaycastHit CastRay()
    {
        // 射线最远的点
        Vector3 screenMousePosFar = new Vector3(
            Input.mousePosition.x,
            Input.mousePosition.y,
            Camera.main.farClipPlane);
        // 射线最近的点
        Vector3 screenMousePosNear = new Vector3(
            Input.mousePosition.x,
            Input.mousePosition.y,
            Camera.main.nearClipPlane);
        Vector3 worldMousePosFar = Camera.main.ScreenToWorldPoint(screenMousePosFar);
        Vector3 worldMousePosNear = Camera.main.ScreenToWorldPoint(screenMousePosNear);
        RaycastHit hit;
        Physics.Raycast(worldMousePosNear, worldMousePosFar - worldMousePosNear, out hit);

        return hit;
    }
}

标签:__,unity3d,鼠标,拼图,GameObject,Vector3,position,selectedObject
From: https://blog.csdn.net/m0_74289471/article/details/141570415

相关文章

  • (大三上_游戏开发设计模式_上课_1)多态练习_计算机
    灵活性,可扩展,灵活性,可维护封装继承:要有基类代码片段写整个属性    基类里面 基态      基方向,虚方法//虚方法,可以写在实例方法里 publicvirtualdoubleGetResult() {  return0;}实例方法,可以创建实例抽象方法,要写在抽......
  • tomcat接口优化
    ApacheTomcat是一个开源的Servlet容器,主要用于部署JavaWeb应用程序。对于Tomcat接口(通常指的是暴露给外部访问的Web服务端点)的优化,可以从多个方面入手,包括但不限于性能、安全性、可维护性等方面。以下是几个常见的优化方向:1.性能优化JVM配置:调整JVM参数,例如设置合适的堆内存大......
  • python基础三之基本数据类型
    1.数字类型及操作1.1整数类型  可正可负,没有取值范围限制pow(x,y) 计算x的y次方,想算多大算多大4种进制表示形式十进制:如:1019,8,-8二进制:由0b或0B开头,只由0,1组成,如:0b0110,-0B101010101八进制:由0O或0o开头:0O123,-0O445十六进制:又0X或0x开头:0X89,-0x9a1.2......
  • IO流:缓冲流
    字节缓冲流简介缓冲流是对原原始流进行包装,提高原始流读写数据的性能。提供8KB输入输出缓冲区。 用法publicclassBufferedInputStreamTest1{publicstaticvoidmain(String[]args){try{//1.定义一个字节缓冲输入流包裹原始的字节输入流......
  • 【华为OD机试真题E卷】31、最大社交距离 | 机试真题+思路参考+代码分析(E卷复用)(C语言、
    文章目录一、题目......
  • 深入解析多商户商城系统源码:如何开发直播商城小程序?
    本篇文章,小编将深入解析多商户商城系统源码的关键技术,并详细探讨如何基于这些源码开发一个功能完善的直播商城小程序。一、多商户商城系统源码的核心构架多商户商城系统源码的核心在于其能够支持多个商户独立运营,但同时又在一个统一的平台上实现数据的共享与整合。这个系统的核心构......
  • 前端宝典二十三:Array最常用的34个方法
    这里列举了Array最常用的34个方法其中静态方法两个、实例方法32个,对他们进行了分类比较,有助于更好的掌握。一、前言:手写一个深拷贝以下是一个用JavaScript手写的深拷贝方法,考虑了正则表达式、日期对象、数组和普通对象:functiondeepCopy(obj){if(obj===null......
  • 多线程编程(面试重中之中,超简单理解)
    最近项目比较紧急,固本之旅卡顿了一段时间,抽时间看了一下多线程,面试重点知识!!!多线程编程优点:提高程序的响应速度,增加用户的体验;提高计算机系统CPU的利用率;优化程序结构,将一个复杂的单线程分化成多个清晰化的单线程,更有利于维护并行指两个以上的事物在同一时刻同时发......
  • 孤独症寄宿学校比较好的学校有哪些?
    在探讨孤独症寄宿学校的选择时,我们不难发现,市场上涌现出了一批专业且富有成效的机构,它们为孤独症儿童提供了全方位的支持与帮助。其中,星贝育园康复中心以其独特的优势脱颖而出,成为众多家庭信赖的选择。星贝育园康复中心是目前全国规模较大的自闭症全托寄宿制儿童康复训练机构......
  • ENSP故障解决参考方案
    ​一、概述大家在使用ENSP时,经常会出现AR或CE12800,USG6000V启动失败,大致分为两类,一类是报错,一类是启动后一致出现#号,这些错误导致eNSP无法使用,大家可以按我的方法一一排除,可能这些方法不一定适合你,但是可以试试二、启动时报40错误在windows桌面新建一个txt本文......