实例化游戏物体的实例(生成游戏物体)

news2025/2/26 9:47:20
一、实例1:实例化
1、准备工作:制备预制体,命名。如Circle
2、Create Empty,名字自取。如:CirclePrefab
3、给CirclePrefab添加Test.cs
    public GameObject CirclePrefab; // 预制体变量,用于存储Circle预制体的引用

    // Start is called before the first frame update
    void Start()
    {
        CreateCircle(); // 在游戏开始时调用CreateCircle方法生成物体
    }

    void CreateCircle()
    {
        // 使用Instantiate方法从预制体创建一个新的游戏对象实例
        GameObject newCircle = Instantiate(CirclePrefab);
        
        // 将新创建的物体设置为某个特定位置
        // newCircle.transform.position = new Vector3(x, y, z);
        
        // 让新创建的物体成为当前游戏对象的子物体
        // newCircle.transform.SetParent(this.transform);
    }
4、回到Unity,赋值
二、实例2:随机实例化不同物体

限定时间,限定范围,随机位置,随机生成陷阱内的物体

三、实例3:实例化UI物体,随机显示图片
1、Unity设置

(1) UI-Image,名字自取。如:food,设置图片大小80*80,制成预制体,删除Hierarchy中的food

(2) 选中Canvas,Create Empty。名字自取,如:foodArea

(3) 选中foodArea,按住Alt,选择放大到和Canvas大小相同,添加一个名为“FoodArea”的标签

2、新建foodArea.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class foodArea : MonoBehaviour
{
    public int Xlimit = 35;//X轴的限制范围
    public int Ylimit = 19;
    public int xoffset = 17;//X轴的偏移量
    public GameObject foodPrefab;//预制体的空白图片
    public Sprite[] foodSprites;//存储食物图片的数组(图片用来填装预制体的空白)
    private Transform foodEmpties;//图片位置//存放食物图片的空物体位置
    // Start is called before the first frame update
    void Start()
    {
        // 使用标签查找GameObject
        GameObject foodArea = GameObject.FindWithTag("FoodArea");
        if (foodArea != null)//如果找到了
        {
            foodEmpties = foodArea.transform;//图片位置在foodArea的Transform位置上
                                             //将foodEmpties设置为找到的GameObject的Transform
        }
        else
        {
            Debug.LogError("找不到带有'FoodArea'标签的GameObject");
        }
        CreateFood();
    }
    public void CreateFood()
    {
        // 在限制范围内随机生成食物的X和Y坐标
        int index = Random.Range(0, foodSprites.Length);//从图片数组中随机选择一个索引(在0和图片数量之间)
        GameObject food = Instantiate(foodPrefab);//实例化的预制体(foodPrefab)名字为food
        food.GetComponent<Image>().sprite = foodSprites[index];//设置食物预制体上Image组件的sprite为随机选中的图片
        food.transform.SetParent(foodEmpties, false);//将食物设置为foodEmpties的子物体,并保持其本地位置不变
        int x = Random.Range(-Xlimit + xoffset, Xlimit);
        int y = Random.Range(-Ylimit, Ylimit);
        food.transform.localPosition = new Vector3(x * 25, y * 25, 0);//实例化的物体的本地位置
    }
}
3、赋值
四、实例4:实例化长度随文字数量变化的可拖拽的按钮
1、准备工作:

(1) UI-Button TextMeshPro,名字自取。如TestBtn

(2) Create Empty,名字自取。如:nodesPrefab

(3) 将TestBtn中的文字和按钮拆分,并设置为nodesPrefab的子物体

(4) Text(TMP)的额外设置

Raycast:用户点击或触摸屏幕时,由摄像机的位置发出的一条射线。

这条射线起点是摄像机的位置,它连到被点击的屏幕的位置并发射到场景中的无限远

Unity会对这条射线与场景中的所有物体进行碰撞检测(物体是否与射线相交)。并根据碰撞结果触发相应的事件(如点击按钮、拖动滑动条等)

Raycast Target:用于设置该文本是否可以成为射线投射(Raycast)的目标

勾选时,可被检测到,可设置触发相应事件

不勾选时:无交互事件(无交互事件的时候不要勾选)

2、设置按钮长度随文本字数改变

(1) 新建Nodes.cs

(2) 在nodesPrefab上添加Nodes.cs

using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;

public class Nodes : MonoBehaviour
{
    public GameObject nodeBtn;//在Unity中声明并指定nodeBtn是哪个物体
    public TextMeshProUGUI nodeTitle;
    // Start is called before the first frame update
    void Start()
    {
        //Debug.Log(nodeTitle.text.Length);//测试能否获取文本长度

        if (nodeBtn != null)//如果nodeBtn已被赋值
        {
            Transform nodeTrans = nodeBtn.transform;  //把nodeBtn的Transform,赋值给nodeTrans变量
            RectTransform nodeRect = nodeBtn.GetComponent<RectTransform>();//获取nodeBtn的RectTransform
            if (nodeRect != null)
            {
                int widthNodeBtn = nodeTitle.text.Length*25+30;//按钮的宽度等于文本的长度*25 + 30
                nodeRect.sizeDelta = new Vector2(widthNodeBtn, 30);//按钮的宽,高
                Debug.Log(nodeRect.sizeDelta);//测试是否获取了nodeBtn的RectTransform中的size
            }
            else
            {
                Debug.LogError("无法从nodeBtn获取RectTransform组件");
            }
        }
        else
        {
            Debug.LogError("nodeBtn不存在");
        }
    }
}
3、设置按钮可拖拽

(1) 打开Nodes.cs

  
public Vector2 dragOffset; // 存储拖拽偏移量


public void OnMouseDown()
    {
        // 当鼠标按下时,计算偏移量
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);//将鼠标屏幕坐标转换成世界坐标
        dragOffset = new Vector2(worldPos.x, worldPos.y) - (Vector2)this.transform.position;//偏移量=世界坐标-当前物体所在的位置
    }
public void OnMouseDrag()
    {
        Debug.Log("拖拽事件");

        // 将鼠标的屏幕坐标转换为世界坐标
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        // 计算新的位置(考虑偏移量)
        Vector2 newPosition = new Vector2(worldPos.x, worldPos.y) - dragOffset;

        // 更新物体的位置
        this.transform.position = new Vector2(newPosition.x, newPosition.y);
    }

(2) 回到Unity,选中Button,添加Event Trigger组件,并赋值

4、把nodesPrefab制成预制体,并在Hierarchy面板上删除该预制体
5、实例化按钮物体

(1) 新建Test.cs,挂载到Hierarchy界面上的物体上,如:Canvas上

(2) 打开Test.cs

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

public class Test : MonoBehaviour
{
    public Nodes node;//
    // Start is called before the first frame update
    void Start()
    {
        CreateNode();//游戏开始运行时生成Node物体
    }

    public void CreateNode()
    {
        //Debug.Log("测试创建物体");
        Instantiate(node,this.transform);//node:原型(模板);this.transform:克隆出来的物体是挂载物体的子物体
    }
}
五、实例5:在实例4的基础上,实例化文本不同的按钮

1、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang免杀-编码加密-Xor(GG)

go语言环境搭建 Golang学习日志 ━━ 下载及安装_golang下载-CSDN博客 go run xxx.go go build xxx.go 首先,cs.msf生成比特流数据. 放入xor,py脚本中进行xor加密. xor.py def xor(shellcode, key):new_shellcode ""key_len len(key)# 对shellcode的每一位进行…

有监督学习——线性回归

1. 线性模型 有监督学习是通过已知的样本产生预测模型的学习方法&#xff0c;任何有监督学习模型都可被想象成一个函数&#xff1a; 其中&#xff0c;\(x_1,x_2,x_3…x_n\)是模型的n维的特征值&#xff0c;\(y\)是要预测的目标值/分类&#xff0c;当\(y\)是可枚举的类型时&…

【leetcode--字母异位词分组】

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:np collections.defaultdict(list)for st in strs:name "".join(sorted(st))np[name].append(st)return list(np.values()) collections.defaultdict(list)创建字典类型&#xff…

给你一个扫码支付的二维码,如何写测试用例?

前言 面试的时候&#xff0c;经常会临场出题&#xff1a;给你一个xxx, 如何测试, 或者说如何写测试用例&#xff1f;xxx可以是圆珠笔&#xff0c;水杯&#xff0c;电梯等生活中常见的场景。 那么给你一个支付的二维码&#xff0c;如何写测试用例呢&#xff1f; 二维码扫码支…

Vue路由守卫的使用

示例如下&#xff1a;&#xff08;第一张图&#xff09;当你点击车1的时候你写了路由守卫就点不开出现无权访问 &#xff08;第二张图&#xff0c;就是可以访问后的图&#xff09;有路由守卫点不开的情况下当你在本地存储中写了你在路由守卫中写的东西就可以进入了 你需要在r…

材料科学SCI期刊,中科院3区,IF=3.8,专业性强

一、期刊名称 Materials Today Communications 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;材料科学 影响因子&#xff1a;3.8 中科院分区&#xff1a;3区 三、期刊征稿范围 《今日材料通讯》是一本范围广泛、多学科、快速出版的期刊&#xff0c;专注…

【docker】Dockerfile制作基础镜像 python 底层镜像制作 | 打包所有的requirement依赖

一、Dockerfile思想 我们正常的对一个项目进行打包 docker image 通常是在CI工具编译时进行对依赖的安装&#xff0c;比如golang的go get、python的pip install、node的npm install 等等 好处&#xff1a;我们更新了依赖可以动态的再编译时进行一个对依赖的更新 坏处&#xf…

Spring 内置BeanFactoryPostProcessor的子孙们

同样的Spring 也 内置了 一些实现 BeanFactoryPostProcessor的类&#xff0c;各有各的用处。 spring-context AspectJWeavingEnabler 用来把ClassPreProcessorAgentAdapter注册到LoadTimeWeaver中ConfigurationClassPostProcessor 一个重要的类&#xff0c;用来处理Configurat…

Redis应用:基于Redis实现排行榜、点赞、关注功能

文章目录 1. 环境准备2. 实现排行榜功能2.1 添加用户分数2.2 获取排行榜2.3 获取用户排名2.4 更新用户分数示例代码3. 实现点赞功能3.1 添加点赞3.2 获取点赞数3.3 检查用户是否点赞3.4 取消点赞示例代码4. 实现关注功能4.1 添加关注4.2 获取粉丝列表4.3 获取关注列表4.4 取消关…

【区间合并 差分 栈】3169. 无需开会的工作日

本文涉及知识点 区间合并 差分数组&#xff08;大约2024年7月1号发) LeetCode3169. 无需开会的工作日 给你一个正整数 days&#xff0c;表示员工可工作的总天数&#xff08;从第 1 天开始&#xff09;。另给你一个二维数组 meetings&#xff0c;长度为 n&#xff0c;其中 me…

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘&#xff0c;双方分别用黑白两种颜色的棋子进行对战。黑子先行&#xff0c;双方轮流在空棋盘的交叉点上落子&#xff0c;每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线&#xff0c;这条…

BSCI验厂是什么?

BSCI验厂是指Business Social Compliance Initiative&#xff0c;即倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细介绍&#xff1a; 背景介绍&#xff1a; 2003年3月&#xff0c;总部设在比利时布鲁塞尔的对外贸易协会FTA正式…

618网络机顶盒哪个牌子好?内行盘点网络机顶盒排行榜

因工作原因每天都在跟各种类型的网络机顶盒打交道&#xff0c;最近超多朋友问我网络机顶盒哪个牌子好&#xff0c;不知道如何挑选网络机顶盒&#xff0c;我将要分享目前最值得入手的网络机顶盒排行榜&#xff0c;想买网络机顶盒可以看看以下这些品牌&#xff1a; ★泰捷WEBOX 6…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端&#xff1b;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置&#xff08;很麻烦跟着输就行&#xff09; 继续 出现如上…

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中&#xff0c;易分类的负样本占据主导地位的问题&#xff0c;从而导致模型难以…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

JAVA面试常见面试问题02

1、jvm 内存结构图 对jvm直观的了解 答&#xff1a; jvm是一个抽象执行环境&#xff0c;它通过加载字节码、实现跨平台运行、管理内存&#xff08;包括自动垃圾回收&#xff09;、优化代码执行等&#xff0c;为Java程序提供运行时支持 2、内存泄漏 和 内存溢出 答&#xf…

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

碳中和研究院OLED透明屏2x2整机项目方案

一、项目背景 随着全球气候变化和环境问题的日益严重&#xff0c;碳中和成为各国政府和企业的重要议题。为了响应这一趋势&#xff0c;黑龙江碳中和研究院计划引入先进的OLED透明屏技术&#xff0c;以展示其研究成果和碳中和理念。本项目旨在为该研究院提供一套高质量的OLED透明…