【Unity3D】《跳舞的线》游戏的方块单方向拉伸实现案例

news2025/1/27 4:40:15

通过网盘分享的文件:CubeMoveMusic.unitypackage
链接: https://pan.baidu.com/s/1Rq-HH4H9qzVNtpQ84WXyUA?pwd=a7xn 提取码: a7xn 

运行游戏点击空格动态创建拉伸的方块,由Speed控制速度,新方向是随机上下左右生成。 

 

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

public class CubeMoveGameCamera : MonoBehaviour
{
    private Vector3 constDir;

    public GeneMap geneMap;

    void Start()
    {
        constDir = transform.position - geneMap.defaultPos;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = constDir + geneMap.GetPos();
    }
}

生成移动方块以及单方向拉伸方块脚本:

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

public class GeneMap : MonoBehaviour
{
    public enum Side
    {
        Top, Bottom, Left, Right
    }

    public GameObject cubePrefab;

    private GameObject movingCubeGo;
    private Transform movingCubeTrans;
    private Side moveSide;

    public Vector3 defaultPos;

    public float speed = 1f;

    private Matrix4x4 rotationMatrix4x4;

    private void Start()
    {
        rotationMatrix4x4 = Matrix4x4.TRS(Vector3.zero, cubePrefab.transform.localRotation, Vector3.one);
    }

    Side MirrorSide(Side side)
    {
        if (side == Side.Top)
        {
            return Side.Bottom;
        }
        if (side == Side.Bottom)
        {
            return Side.Top;
        }
        if (side == Side.Left)
        {
            return Side.Right;
        }
        if (side == Side.Right)
        {
            return Side.Left;
        }
        Debug.LogError("?");
        return Side.Top;
    }

    public bool IsMoving()
    {
        return movingCubeGo != null;
    }

    public Vector3 GetPos()
    {
        Vector3 pos = defaultPos;
        if (IsMoving())
        {
            //利用上一个移动物体的方向,通过不同方向的移动物体局部大小得到偏移量,而0.5f是下一个新物体一半的偏移
            Vector3 oldOffset = Vector3.zero;
            switch (moveSide)
            {
                case Side.Top:
                    oldOffset = new Vector3(0, 0, movingCubeTrans.localScale.z - 0.5f);
                    break;
                case Side.Bottom:
                    oldOffset = new Vector3(0, 0, -movingCubeTrans.localScale.z + 0.5f);
                    break;
                case Side.Left:
                    oldOffset = new Vector3(-movingCubeTrans.localScale.x + 0.5f, 0, 0);
                    break;
                case Side.Right:
                    //例如上一个物体是右方向,则使用局部大小x作为偏移量数值,并且需要-0.5f来让新物体的整体恰好在前一个延伸物体的内部。
                    oldOffset = new Vector3(movingCubeTrans.localScale.x - 0.5f, 0, 0);
                    break;
                default:
                    break;
            }
            pos = movingCubeTrans.position + rotationMatrix4x4.MultiplyPoint(oldOffset);
        }
        return pos;
    }

    private void Update()
    {
        if (movingCubeGo != null)
        {
            if (moveSide == Side.Top || moveSide == Side.Bottom)
            {
                movingCubeTrans.localScale = new Vector3(1, 1, movingCubeTrans.localScale.z + speed * Time.deltaTime);
            }
            else
            {
                movingCubeTrans.localScale = new Vector3(movingCubeTrans.localScale.x + speed * Time.deltaTime, 1, 1);
            }
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Vector3 pos = GetPos();
            movingCubeGo = GameObject.Instantiate(cubePrefab);
            movingCubeTrans = movingCubeGo.transform;

            List<int> sideList = new List<int>();
            for (int i = 0; i < 4; i++)
            {
                if (i != (int)moveSide && i != (int)MirrorSide(moveSide))
                {
                    sideList.Add(i);
                }
            }
            int randomIndex = Random.Range(0, sideList.Count);
            moveSide = (Side)sideList[randomIndex];

            //1、新物体在进行朝着新方向移动时,需要对子物体Cube调整局部位置(目的:锚点轴心偏移,实现单方向延伸)
            //2、newOffset用于将新移动物体偏移到新移动方向的上一个物体边缘位置点
            Vector3 newOffset = Vector3.zero;
            Vector3 newLocalScale = Vector3.one;
            Transform childTrans = movingCubeTrans.Find("Cube");
            childTrans.GetComponent<MeshRenderer>().material.SetColor("_Color", new Color(Random.Range(0, 256) / 255f, Random.Range(0, 256) / 255f, Random.Range(0, 256) / 255f, 1));
            switch (moveSide)
            {
                case Side.Top:
                    childTrans.localPosition = new Vector3(0, 0, 0.5f);
                    newOffset = new Vector3(0, 0, 0.5f);
                    newLocalScale = new Vector3(1, 1, 0);
                    break;
                case Side.Bottom:
                    childTrans.localPosition = new Vector3(0, 0, -0.5f);
                    newOffset = new Vector3(0, 0, -0.5f);
                    newLocalScale = new Vector3(1, 1, 0);
                    break;
                case Side.Left:
                    childTrans.localPosition = new Vector3(-0.5f, 0, 0);
                    newOffset = new Vector3(-0.5f, 0, 0);
                    newLocalScale = new Vector3(0, 1, 1);
                    break;
                case Side.Right:
                    //例如右方向的Cube子物体需要偏移(0.5f,0,0)保证锚点是在物体左侧
                    childTrans.localPosition = new Vector3(0.5f, 0, 0);
                    //右方向的新物体起点要在上一个物体的右侧边缘点作为起点,故x轴+0.5f
                    newOffset = new Vector3(0.5f, 0, 0);
                    //右方向的新物体大小X轴要从0开始
                    newLocalScale = new Vector3(0, 1, 1);
                    break;
                default:
                    break;
            }
            movingCubeTrans.position = pos + rotationMatrix4x4.MultiplyPoint(newOffset);
            movingCubeTrans.localScale = newLocalScale;
        }
    }
}

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

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

相关文章

Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件

地址:https://github.com/MartinxMax/Chameleon Chameleon 跨平台编译C文件&#xff0c;并一次性生成多个平台的可执行文件。可以通过编译Chameleon自带的.C文件反向Shell生成不同平台攻击载荷。 登录 & 代理设置 按照以下步骤设置 Docker 的代理&#xff1a; 创建配置目…

解读2025年生物医药创新技术:展览会与论坛的重要性

2025生物医药创新技术与应用发展展览会暨论坛&#xff0c;由天津市生物医药行业协会、BIO CHINA生物发酵展组委会携手主办&#xff0c;山东信世会展服务有限公司承办&#xff0c;定于2025年3月3日至5日在济南黄河国际会展中心盛大开幕。展会规模60000平方米、800参展商、35场会…

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…

git常用命令学习

目录 文章目录 目录第一章 git简介1.Git 与SVN2.Git 工作区、暂存区和版本库 第二章 git常用命令学习1.ssh设置2.设置用户信息3.常用命令设置1.初始化本地仓库init2.克隆clone3.查看状态 git status4.添加add命令5.添加评论6.分支操作1.创建分支2.查看分支3.切换分支4.删除分支…

Linux的基本指令(上)

1.ls指令 语法&#xff1a;ls [选项] [目录或文件] 功能&#xff1a;对于⽬录&#xff0c;该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件&#xff0c;将列出⽂件名以及其他信息。 常用选项&#xff1a; -a 列出⽬录下的所有⽂件&#xff0c;包括以 . 开头的隐含⽂件。 -d 将…

【单链表算法实战】解锁数据结构核心谜题——相交链表

题目如下&#xff1a; 解题过程如下&#xff1a; 相交链表只可以在中间任意位置/头/尾结点相交&#xff0c;如下图&#xff1a; 一个next指针只能指向一块地址&#xff0c;所以不会出现这种情况&#xff1a; 在返回相交链表的起始结点之前先要判断两个链表是否相交&#xff0…

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新校园网设计。 我是一个萌新小白&#xff0c;有误地方请大家指正&#xff0c;谢谢…

深度学习 Pytorch 单层神经网络

神经网络是模仿人类大脑结构所构建的算法&#xff0c;在人脑里&#xff0c;我们有轴突连接神经元&#xff0c;在算法中&#xff0c;我们用圆表示神经元&#xff0c;用线表示神经元之间的连接&#xff0c;数据从神经网络的左侧输入&#xff0c;让神经元处理之后&#xff0c;从右…

政安晨的AI大模型训练实践三:熟悉一下LF训练模型的WebUI

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 启动WebUI 微调模型 LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 启动Web…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游数据如何落…

【深入理解SpringCloud微服务】Sentinel规则持久化实战

Sentinel规则持久化实战 Sentinel规则推送模式原始模式pull&#xff08;拉模式&#xff09;push&#xff08;推模式&#xff09; 实现拉模式实现推模式 Sentinel规则推送模式 原始模式 原始模式由Sentinel控制台直接推送规则到Sentinel客户端&#xff0c;Sentinel客户端将规则…

PCIE模式配置

对于VU系列FPGA&#xff0c;当DMA/Bridge Subsystem for PCI Express IP配置为Bridge模式时&#xff0c;等同于K7系列中的AXI Memory Mapped To PCI Express IP。

【由浅入深认识Maven】第2部分 maven依赖管理与仓库机制

文章目录 第二篇&#xff1a;Maven依赖管理与仓库机制一、前言二、依赖管理基础1.依赖声明2. 依赖范围&#xff08;Scope&#xff09;3. 依赖冲突与排除 三、Maven的仓库机制1. 本地仓库2. 中央仓库3. 远程仓库 四、 版本管理策略1. 固定版本2. 版本范围 五、 总结 第二篇&…

备赛蓝桥杯之第十五届职业院校组省赛第一题:智能停车系统

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

力扣 Hot 100 题解 (js版)更新ing

&#x1f6a9;哈希表 ✅ 1. 两数之和 Code&#xff1a; 暴力法 复杂度分析&#xff1a; 时间复杂度&#xff1a; ∗ O ( N 2 ) ∗ *O(N^2)* ∗O(N2)∗&#xff0c;其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。空间复杂度&#xff1a;O(1)。 /…

DeepSeek-R1:性能对标 OpenAI,开源助力 AI 生态发展

DeepSeek-R1&#xff1a;性能对标 OpenAI&#xff0c;开源助力 AI 生态发展 在人工智能领域&#xff0c;大模型的竞争一直备受关注。最近&#xff0c;DeepSeek 团队发布了 DeepSeek-R1 模型&#xff0c;并开源了模型权重&#xff0c;这一举动无疑为 AI 领域带来了新的活力。今…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

校园商铺管理系统设计与实现(代码+数据库+LW)

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

【JavaWeb学习Day13】

Tlias智能学习系统 需求&#xff1a; 部门管理&#xff1a;查询、新增、修改、删除 员工管理&#xff1a;查询、新增、修改、删除和文件上传 报表统计 登录认证 日志管理 班级、学员管理&#xff08;实战内容&#xff09; 部门管理&#xff1a; 01准备工作 开发规范-…

springboot使用tomcat浅析

springboot使用tomcat浅析 关于外部tomcat maven pom配置 // 打包时jar包改为war包 <packaging>war</packaging>// 内嵌的tomcat的scope标签影响范围设置为provided&#xff0c;只在编译和测试时有效&#xff0c;打包时不带入 <dependency><groupId>…