Unity之创建第一个2D游戏项目

一 Unity环境配置

1.1 Untity资源官网下载:https://unity.cn/releases

7809e26a5c1f45e49d0a972fde264483.png

1.2 Unity Hub集成环境,包含工具和项目的管理

ee8bd7d92b3443aba065134e51b97fcc.png

1.3 Unity Editor编辑器

a5afe3362d9d48d1be137de76d1cedaa.png1.4 Visual Studio 2022脚本编辑器

d8ad8983dc964e4cac255e34973cca83.png

1.5 AndroidSKD,JDK,NDK工具,用于android环境的运行

7043b3c77f664511a052ac60f28c06d6.png

二 创建Unity项目

2.1 新建2D模板项目211d66aca7eb4c96850de94c176e3c8a.png

d74e22e6c2d6428492cc0af1149f9e40.png

2.2 新建2D物体

146964934d02462c9e3ccdadb34d4c8e.png

2.3 新建C#脚本文件 

595d8433b82543e0bdef2e9602ea282a.png

2.4 脚本文件拖拽到物理区域,关联物体 

ca6d8b0a44ff4953a9b4a27bd77b0480.png

2.5 点击脚本打开 Visual Studio 进行编辑

a789d84939034ac4a4dc7736b5ee1f9e.png

2.6 输入Debug.Log(gameObject.name);获取物体的名字,点击运行 

f55a21616dec4cd5b92fc8347c3cd3bb.png

2.7 调试 ,脚本文件保存后,可以看到UnityEditor里面的脚本文件会同步变化

cf9c057fc4424d07bec360f46632273f.png

2.9 点击顶部运行按钮就可以在控制台看到日志输出信息,可以看到打印出了物理对象的名字和标签

4b19bc14f8d6475cae98e3fef977c9a4.png

三 运行问题

3.1 第一次运行可能会出现错误,显示Unity脚本显示“杂项文件”,并且无语法提示的问题

73a154711a974aa48ab4ff15e690e55d.png

3.2  解决方法:点击 编辑(Edit)>首选项(Preferences)打开首选项窗口 

e2c639fdb0264ead81f6b134c7aec7ee.png

3.3 在首选项窗口中,选择 外部工具(External Tools)选项卡,将 外部脚本编辑器(External Script Editor)的设置改为 Visual Studio 2019等编辑器 b5372929d89d4cb98ef0deee76e289d0.png

3.4 可以看到语法能够正常显示了 

808c68efbbad43668fb3b1d4a373aea0.png

四,物体组件认识

4.1  一个物理有很多组件,点击物理,默认组件信息就会出来

fc756b5b0e644826a4689bd6f369bc29.png

4.2 如下可以给物理新加组件信息,比如给物体新加声音组件

099b6ceb991b4c6196f34f8763afcc6a.png

4.3 脚本关联物体后,也也属于物体的一个组件 ,可以在脚本中获取物体的其它组件和控制物体的组件

36238f326f914a3e9e040eea9a29feb6.png

4.4  物体下面还可以创建多个物体,我们创建一个胶囊子物体,那胶囊就属于子组件

012ea1cff2ec4240a7483fe37a584bba.png

4.5 脚本获取基础组件和子组件,父组件。如下获取物体和组件实例:

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;public class main : MonoBehaviour
{public GameObject Capsule;//胶囊组件public GameObject Prefab;//预设体// Start is called before the first frame updatevoid Start(){//拿到当前脚本所挂载的游戏物体//GameObject go = this.gameObject;//名称UnityEngine.Debug.Log(gameObject.name);//tagUnityEngine.Debug.Log(gameObject.tag);//layerUnityEngine.Debug.Log(gameObject.layer);//胶囊的名称UnityEngine.Debug.Log(Capsule.name);//胶囊当前真正的激活状态UnityEngine.Debug.Log(Capsule.activeInHierarchy);//胶囊当前自身激活状态UnityEngine.Debug.Log(Capsule.activeSelf);//获取Transform组件//Transform trans = this.transform;UnityEngine.Debug.Log(transform.position);//获取其他组件BoxCollider bc = GetComponent<BoxCollider>();//获取当前物体的子物体身上的某个组件GetComponentInChildren<CapsuleCollider>(bc);//获取当前物体的父物体身上的某个组件GetComponentInParent<BoxCollider>();//添加一个组件Capsule.AddComponent<AudioSource();//通过游戏物体的名称来获取游戏物体//GameObject test = GameObject.Find("Test");//通过游戏标签来获取游戏物体GameObject test = GameObject.FindWithTag("Enemy");test.SetActive(false);UnityEngine.Debug.Log(test.name);//通过预设体来实例化一个游戏物体GameObject go = Instantiate(Prefab, Vector3.zero, Quaternion.identity);//销毁Destroy(go);}// Update is called once per framevoid Update(){}
}

五 鼠标和触摸事件

5.1 鼠标事件

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.Windows;
using Input = UnityEngine.Input;public class main : MonoBehaviour
{void Start(){}// Update is called once per framevoid Update(){//鼠标的点击//按下鼠标 0左键 1右键 2滚轮if (Input.GetMouseButtonDown(0)){UnityEngine.Debug.Log("按下了鼠标左键");}//持续按下鼠标if (Input.GetMouseButton(0)) {UnityEngine.Debug.Log("持续按下鼠标左键");}//抬起鼠标if (Input.GetMouseButtonUp(0)) {UnityEngine.Debug.Log("抬起了鼠标左键");//按下键盘按键}if (Input.GetKeyDown(KeyCode.A)) {UnityEngine.Debug.Log("按下了A");}//持续按下按键if (Input.GetKey(KeyCode.A)) {UnityEngine.Debug.Log("持续按下A");}//抬起键盘按键if (Input.GetKeyUp("a")){UnityEngine.Debug.Log("松开了A");}}
}

5.2 保存运行后可以看到控制台有对应的日志输出

0033d5d5031041c990b03baf295cc152.png

5.3 手机单点,多点触控、

using UnityEngine;
using Input = UnityEngine.Input;public class main : MonoBehaviour
{void Start(){//开启多点触控Input.multiTouchEnabled = true;}// Update is called once per framevoid Update(){//判断单点触摸if (Input.touchCount == 1){//触摸对象Touch touch = Input.touches[0];//触摸位置UnityEngine.Debug.Log(touch.position);//触摸阶段switch (touch.phase){case UnityEngine.TouchPhase.Began:break;case UnityEngine.TouchPhase.Moved:break;case UnityEngine.TouchPhase.Stationary:break;case UnityEngine.TouchPhase.Ended:break;case UnityEngine.TouchPhase.Canceled:break;}}//判断单点触摸if (Input.touchCount == 2){//触摸对象1Touch touch0 = Input.touches[0];//触摸对象1Touch touch1 = Input.touches[1];}}
}

5.4 物体向量移动,添加物体控制组件

a21b866612564aa0b962db8a08c07144.png

编写向量移动脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlarerControll : MonoBehaviour
{public CharacterController characterController;// Start is called before the first frame updatevoid Start(){characterController = GetComponent<CharacterController>();}// Update is called once per framevoid Update(){//水平轴float horizontal = Input.GetAxis("Horizontal");//垂直轴float vertical = Input.GetAxis("Vertical");//创建成一个方向向量Vector2 dir = new Vector2(horizontal,vertical);Debug.DrawRay(transform.position, dir, Color.red);characterController.SimpleMove(dir);}
}

六 鼠标控制物体移动

6.1 2D用transform属性控制移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlarerControll : MonoBehaviour
{public CharacterController characterController;// Start is called before the first frame updatevoid Start(){characterController = GetComponent<CharacterController>();}// Update is called once per framevoid Update(){if (Input.GetMouseButton(0)){//目前的鼠标二维坐标转为三维坐标Vector2 curMousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);//目前的鼠标三维坐标转为世界坐标curMousePos = Camera.main.ScreenToWorldPoint(curMousePos);transform.position = curMousePos ;}}
}

6.2 在携程里面控制物体移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlarerControll : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){StartCoroutine(OnMouseDown());//在Start方法中调用StartCoroutine(要调用的协程方法)}// Update is called once per framevoid Update(){}//协程IEnumerator OnMouseDown(){//1. 得到物体的屏幕坐标Vector3 cubeScreenPos = Camera.main.WorldToScreenPoint(transform.position);//2. 计算偏移量//鼠标的三维坐标Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);//鼠标三维坐标转为世界坐标mousePos = Camera.main.ScreenToWorldPoint(mousePos);Vector3 offset = transform.position - mousePos;//3. 物体随着鼠标移动while (Input.GetMouseButton(0)){//目前的鼠标二维坐标转为三维坐标Vector3 curMousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);//目前的鼠标三维坐标转为世界坐标curMousePos = Camera.main.ScreenToWorldPoint(curMousePos);//物体世界位置transform.position = curMousePos + offset;yield return new WaitForFixedUpdate(); //这个很重要,循环执行}}
}

6.3 用Translate滑动鼠标移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlarerControll : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// 定义了一个名为sizespeed的公共(public)浮点型(float)变量,初始值为1public float sizespeed = 1;// 定义了一个名为mouseSpeed的公共浮点型变量,初始值为10public float mouseSpeed = 10;  // 定义了一个名为lastMousePosition的私有(private)Vector3类型变量private Vector3 lastMousePosition;    // Update is called once per framevoid Update(){// 获取鼠标滚轮的输入值,并将其赋值给名为mouse的局部(local)浮点型变量float mouse = -Input.GetAxis("Mouse ScrollWheel");   // 鼠标中键按住拖动if (Input.GetMouseButton(0)){   // 获取当前鼠标位置和上一次鼠标位置之间的差值,并将其赋值给名为deltaMousePosition的局部Vector3类型变量Vector3 deltaMousePosition = Input.mousePosition - lastMousePosition;// 将摄像机的位置向左右和上下移动,移动的距离由鼠标的移动距离和鼠标速度决定transform.Translate(deltaMousePosition.x * mouseSpeed * Time.deltaTime, deltaMousePosition.y * mouseSpeed * Time.deltaTime, 0);    }// 将摄像机的位置向上或向下移动,移动的距离由鼠标滚轮的输入值和大小速度决定transform.Translate(new Vector3(0, mouse * sizespeed, 0) * Time.deltaTime, Space.World);// 将鼠标当前位置赋值给lastMousePosition变量,以便下一帧计算鼠标位置差值lastMousePosition = Input.mousePosition;    }
}

七 向量的认识

7.1 向量在游戏角色世界是非常重要的一个概念,上面大部分物体的移动都是通过向量Vector3 

7.2 向量指一个同时具有大小和方向的量. 它通常画为一个带箭头的线段(如下图).线段的长度可以表示向量的大小,而向量的方向也就是箭头所指的方向.物理学中的位移、速度、力等都是矢量

7.3 只要向量的大小和方向相同, 即视为相等的向量, 如下图所示都是相同的向量.

7.4 向量的加法可以用几种三种法则来解释, 比如下面的三角形法则

7.5 向量的减法也有类似运算法则, 三角形法则和平行四边形, 记得箭头总是由减数指向被减数:

7.6 向量 b 与一个标量(实数)相乘还是一个向量, 观察下面的当标量改变时候, 向量 a 的变化:

八 示例,碰撞物体

8.1 创建一个角色

8.2 给角色添加刚体和碰撞体,把重力设为0,不然会向下移动出场景

8.3 新建红色障碍物碰撞体,同时也添加碰撞体

 8.3  在脚本里面编写键盘按键控制物体移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyPlayer : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framepublic float speed = 5f;//移动速度void Update(){float moveX = Input.GetAxisRaw("Horizontal");//控制水平移动方向 A:-1 D:1 0float moveY = Input.GetAxisRaw("Vertical");//控制垂直移动方向 W: 1 S:-1 0Vector2 position = transform.position;position.x += moveX * speed * Time.deltaTime;position.y += moveY * speed * Time.deltaTime;transform.position = position;}
}

8.5 运行可以看到碰撞到障碍物停止的效果

8.6 优化,发现角色碰到物体会抖动和旋转,旋转需要勾选上脚色刚体的旋转约束属性

8.7 抖动问题需要编写脚本,用刚体的移动替换脚色的移动,修改如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyPlayer : MonoBehaviour
{public Rigidbody2D rbody;// Start is called before the first frame updatevoid Start(){rbody = GetComponent<Rigidbody2D>();}// Update is called once per framepublic float speed = 10f;//移动速度void Update(){float moveX = Input.GetAxisRaw("Horizontal");//控制水平移动方向 A:-1 D:1 0float moveY = Input.GetAxisRaw("Vertical");//控制垂直移动方向 W: 1 S:-1 0Vector2 position = rbody.position;position.x += moveX * speed * Time.deltaTime;position.y += moveY * speed * Time.deltaTime;//transform.position = position;rbody.MovePosition( position);}
}

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

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

相关文章

分享一个基于微信小程序开发的高校学生毕业设计选题小程序的源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …

RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品&#xff0c; 首先我们以Web管理页面为 入口&#xff0c;来了解下RabbitMQ的一些基础概念&#xff0c;这样我们后续才好针对这些基础概念 进行编程实战。 可以参照下图来理解RabbitMQ当中的基础概念&#xff1a; 虚拟主机 virtual hos…

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

文章目录 一、构造函数意义1、类的构造函数2、构造函数显式调用与隐式调用3、构造函数替代方案 - 初始化函数4、初始化函数缺陷5、默认构造函数6、代码示例 - 初始化函数无法及时调用 一、构造函数意义 1、类的构造函数 C 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化…

正则表达式使用总结

一、字符匹配 普通字符&#xff1a;普通字符按照字面意义进行匹配&#xff0c;例如匹配字母 "a" 将匹配到文本中的 "a" 字符。 元字符&#xff1a;元字符具有特殊的含义&#xff0c;例如 \d 匹配任意数字字符&#xff0c;\w 匹配任意字母数字字符&#xf…

【遥感变化检测综述】—《多时相遥感影像的变化检测研究现状与展望》

作者&#xff1a;张 祖 勋&#xff0c;姜 慧 伟&#xff0c;庞 世 燕&#xff0c;胡 翔 云 论文连接&#xff1a;多时相遥感影像的变化检测研究现状与展望 — 张祖勋 1、内容概述 本文主要从几何和语义两个角度对变化检测方法进行了分析和归纳总结&#xff0c;重点分析了几何信…

SQL5 将查询后的列重新命名

描述 题目&#xff1a;现在你需要查看前2个用户明细设备ID数据&#xff0c;并将列名改为 user_infos_example,&#xff0c;请你从用户信息表取出相应结果。 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学…

Debian离线安装mysql

PS:虽然已经分享了很多安装各种环境订的教程&#xff0c;但是每个客户的环境不一样&#xff0c;那就得重新来一次&#xff0c;其实都是大同小异的&#xff0c;但是里面其实也是存在不少坑的&#xff0c;今天我们就来安装一个新的东西&#xff0c;Debian 11离线安装mysql,为什么…

无涯教程-JavaScript - RATE函数

描述 RATE函数返回年金每个周期的利率。 RATE通过迭代计算得出,可以有零个或多个解。如果RATE的连续输出在20次迭代后未收敛到0.0000001以内,则RATE返回#NUM!错误值。 语法 RATE (nper, pmt, pv, [fv], [type], [guess])有关参数nper,pmt,pv,fv和type的完整说明,请参见PV Fu…

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …

基于springboot的新闻门户网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

接口测试 —— Requests库GET请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 &#xff08;不带参数的GET请求请看上一篇文章的练习&#xff09; 1、Requests库待参数的GET请求 使用Get方法带参数请求时&#xff0c;是params参数字典&#xff0c;而不是data参数字典。data参数字典…

基本Dos命令

1.打开cmd的方式 &#xff08;1&#xff09;winR&#xff0c;输入cmd即可 &#xff08;2&#xff09;在任意文件夹下面&#xff0c;按住shift键后点击鼠标右键&#xff0c;即可在此文件夹目录下打开命令行窗口。 &#xff08;3&#xff09;资源管理器的地址栏前面加上 cmd…

uni-app直播从0到1实战

1.安装开发工具 2.创建项目 参考&#xff1a;uniapp从零到一的学习商城实战_云澜哥哥的博客-CSDN博客 3.编写公共样式&#xff1a;common.css & free.css App.vue引入公共文件&#xff1a; 图标库&#xff1a;iconfont-阿里巴巴矢量图标库

MapTR v2文章研读

MapTR v2论文来了&#xff0c;本文仅介绍v2相较于v1有什么改进之处&#xff0c;如果想了解v1版本的论文细节&#xff0c;可见链接。 相较于maptr&#xff0c;maptr v2改进之处&#xff1a; 在分层query机制中引进解耦自注意力机制&#xff0c;有效降低了内存消耗&#xff1b;…

Jenkins 页面部分显示Http状态403 被禁止

前言 生产环境Jenkins部署了一段时间了&#xff0c;结果今天在流水线配置中&#xff0c;部分页面显示Jenkins 页面部分显示Http状态403 被禁止&#xff0c;修改配置点击保存之后偶尔也会出现这个。 问题 以下是问题图片 解决 在全局安全配置里面&#xff0c;勾选上启用代…

电脑磁盘分区形式是什么?如何更改?

磁盘分区形式介绍 在了解为什么以及如何更改分区形式之前&#xff0c;让我们对磁盘分区形式有一个基本的了解。一般来说&#xff0c;分区形式是指主引导记录&#xff08;MBR&#xff09;和 GUID 分区表&#xff08;GPT&#xff09;。 MBR和GPT是Windows系统中常用…

从构建者到设计者的低代码之路

低代码开发技术&#xff0c;是指无需编码或通过少量代码就可以快速生成应用程序的工具&#xff0c;一方面可降低企业应用开发人力成本和对专业软件人才的需求&#xff0c;另一方面可将原有数月甚至数年的开发时间成倍缩短&#xff0c;帮助企业实现降本增效、灵活迭代。那么&…

MySQL 8.0 驱动与阿里druid版本兼容操作

注意&#xff1a;这个异常表面druid数据源的版本与MySql 8.0的驱动版本不匹配&#xff0c;解决方法如下&#xff1a; 确保MySql 8.0的驱动如下网址&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifact…

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…