南阳网站建站培训,深圳画册设计网站,淘宝服务商平台,东莞网站建设外贸视频教程#xff1a;
https://www.bilibili.com/video/BV11D5QzgEpw?spm_id_from333.788.videopod.sectionsvd_source25b783f5f945c4507229e9dec657b5bb
1. 场景搭建
创建工程文件素材导入将游戏场景预制体实例化设置场景光颜色为#xff08;29, 26, 00#xff09;…视频教程https://www.bilibili.com/video/BV11D5QzgEpw?spm_id_from333.788.videopod.sectionsvd_source25b783f5f945c4507229e9dec657b5bb1. 场景搭建创建工程文件素材导入将游戏场景预制体实例化设置场景光颜色为29, 26, 00设置天空颜色为128, 110, 36设置 camera 位置为-31, 25, -20设置 camera 旋转角度为37, 53, 6设置 camera 为正交视野Size 为 8正交投影常用于 2D 游戏开发、UI 设计、建筑图纸绘制等这些场景更关注物体实际尺寸和相对位置不需要模拟真实 3D 空间深度感。比如 2D 横版过关游戏正交投影能保证角色和场景元素大小一致便于玩家把握距离和位置 。透视投影广泛用于 3D 游戏、虚拟现实VR和增强现实AR等场景能营造逼真空间感和深度感让玩家有身临其境的体验。如第一人称射击游戏通过透视投影呈现真实远近效果增强沉浸感。2. 移动旋转创建坦克实例将烟拖动到坦克上设置位置为0.6, 0, -0.94和-0.5, 0, -0.94坦克添加刚体组件坦克添加碰撞盒子设置位置为0, 0.95, 0大小为1.51, 1.71, 1.62注意碰撞盒子不能紧挨地面容易检测坦克与地面发生碰撞导致坦克无法移动。将坦克做成预制体创建脚本文件 Tank.cs添加脚本实现坦克的前后移动功能约束刚体部分轴位置冻结 Y 轴旋转冻结 X 和 Z 轴添加脚本实现坦克旋转功能2.1. Tank.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassTank:MonoBehaviour{publicfloatmoveSpeed;publicfloatangularSpeed;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();}// Update is called once per framevoidUpdate(){}privatevoidFixedUpdate(){Move();}/// summary/// 移动/// /summaryvoidMove(){floatvInput.GetAxis(Vertical);floathInput.GetAxis(Horizontal);rb.velocitytransform.forward*v*moveSpeed;rb.angularVelocitytransform.up*h*angularSpeed;}}3. 两个玩家控制进入输入设置复制 Horizontal 轴修改 Horizontal 控制按键复制 Vertical 轴修改 Vertical 控制按键修改代码实现通过编号区分不同的控制3.1. Tank.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassTank:MonoBehaviour{publicfloatmoveSpeed;publicfloatangularSpeed;publicintplayerNum;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();}// Update is called once per framevoidUpdate(){}privatevoidFixedUpdate(){Move();}/// summary/// 移动/// /summaryvoidMove(){floatvInput.GetAxis(VerticalPplayerNum);floathInput.GetAxis(HorizontalPplayerNum);rb.velocitytransform.forward*v*moveSpeed;rb.angularVelocitytransform.up*h*angularSpeed;}}4. 发射炮弹子弹、爆炸预设体发射位置脚本子弹预设体爆炸预设体4.1. PreShell.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPreShell:MonoBehaviour{publicfloatspeed2f;publicGameObjectpreShellExplosionGo;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();rb.velocitytransform.forward*speed;}// Update is called once per framevoidUpdate(){}privatevoidOnCollisionEnter(Collisioncollision){GameObjectshellExplosionGoInstantiate(preShellExplosionGo,transform.position,transform.rotation);Destroy(gameObject);Destroy(shellExplosionGo.gameObject,1.5f);}}4.2. Tank.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassTank:MonoBehaviour{publicfloatmoveSpeed;publicfloatangularSpeed;publicintplayerNum;publicKeyCodeattackKey;publicTransformshootPointTr;publicGameObjectpreShellGo;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();attackKeyKeyCode.Space;}// Update is called once per framevoidUpdate(){if(Input.GetKeyDown(attackKey)){Shoot();}}privatevoidFixedUpdate(){Move();}/// summary/// 移动/// /summaryvoidMove(){floatvInput.GetAxis(VerticalPplayerNum);floathInput.GetAxis(HorizontalPplayerNum);rb.velocitytransform.forward*v*moveSpeed;rb.angularVelocitytransform.up*h*angularSpeed;}/// summary/// 攻击/// /summaryvoidShoot(){GameObjectshellGoInstantiate(preShellGo,shootPointTr.position,shootPointTr.rotation);//shellGo.GetComponentRigidbody().velocity shellGo.transform.forward * 5;}}5. 产生伤害5.1. PreShell.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPreShell:MonoBehaviour{publicfloatspeed2f;publicGameObjectpreShellExplosionGo;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();rb.velocitytransform.forward*speed;}// Update is called once per framevoidUpdate(){}privatevoidOnCollisionEnter(Collisioncollision){GameObjectshellExplosionGoInstantiate(preShellExplosionGo,transform.position,transform.rotation);Destroy(gameObject);Destroy(shellExplosionGo.gameObject,1.5f);//造成伤害Tanktankcollision.gameObject.GetComponentTank();if(tanknull)return;tank.currentBlood-10;//死亡if(tank.currentBlood0){tank.currentBlood0;Destroy(collision.gameObject);}}}5.2. Tank.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassTank:MonoBehaviour{publicfloatmoveSpeed;publicfloatangularSpeed;publicintplayerNum;publicintcurrentBlood;publicintmaxBlood100;publicKeyCodeattackKey;publicTransformshootPointTr;publicGameObjectpreShellGo;privateRigidbodyrb;// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();attackKeyKeyCode.Space;currentBloodmaxBlood;}// Update is called once per framevoidUpdate(){if(playerNum1Input.GetKeyDown(attackKey)){Shoot();}elseif(playerNum2Input.GetKeyDown(KeyCode.Keypad9)){Shoot();}}privatevoidFixedUpdate(){Move();}/// summary/// 移动/// /summaryvoidMove(){floatvInput.GetAxis(VerticalPplayerNum);floathInput.GetAxis(HorizontalPplayerNum);rb.velocitytransform.forward*v*moveSpeed;rb.angularVelocitytransform.up*h*angularSpeed;}/// summary/// 攻击/// /summaryvoidShoot(){GameObjectshellGoInstantiate(preShellGo,shootPointTr.position,shootPointTr.rotation);//shellGo.GetComponentRigidbody().velocity shellGo.transform.forward * 5;}}6. 摄像机跟随坦克6.1. MainCamera.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassMainCamera:MonoBehaviour{publicTransformtank1;// 第一辆坦克的TransformpublicTransformtank2;// 第二辆坦克的TransformprivateVector3offset;// 摄像机相对于两辆坦克中心的偏移量privateCameramainCamera;// 主摄像机组件privatefloatdistance;// 两辆坦克之间的距离privatefloatcameraSize;// 正交摄像机的尺寸// Start is called before the first frame updatevoidStart(){// 检查是否正确赋值了两个坦克的Transformif(tank1null||tank2null)return;// 计算摄像机的初始偏移量Vector3tanksCenter(tank1.positiontank2.position)/2;offsettransform.position-tanksCenter;// 获取主摄像机组件mainCameraGetComponentCamera();}// Update is called once per framevoidUpdate(){// 如果任意一个坦克不存在则直接返回if(tank1null||tank2null)return;// 更新摄像机的位置Vector3tanksCenter(tank1.positiontank2.position)/2;transform.positiontanksCenteroffset;// 计算两辆坦克之间的距离distanceVector3.Distance(tank1.position,tank2.position);// 根据距离调整摄像机的正交尺寸cameraSizedistance*0.875f;mainCamera.orthographicSizecameraSize;}}7. 添加血条7.1. 设置血条物体新增血条物体设置 Canvas设置 Slider设置 Background设置 Fill7.2. 编写代码7.2.1. PreShell.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPreShell:MonoBehaviour{publicfloatspeed5f;//速度publicintdamage10;//伤害值publicGameObjectpreShellExplosionGo;//爆炸预设体对象privateRigidbodyrb;//刚体// Start is called before the first frame updatevoidStart(){rbGetComponentRigidbody();rb.velocitytransform.forward*speed;}// Update is called once per framevoidUpdate(){}/// summary/// 碰撞则产生爆炸并自我销毁/// /summary/// param namecollision/paramprivatevoidOnCollisionEnter(Collisioncollision){GameObjectshellExplosionGoInstantiate(preShellExplosionGo,transform.position,transform.rotation);//生成爆炸效果Destroy(gameObject);//销毁炮弹Destroy(shellExplosionGo,1.5f);//销毁爆炸效果Tanktankcollision.gameObject.GetComponentTank();if(tank!null){tank.currentBlood-damage;//造成了伤害tank.hpSlider.value(float)tank.currentBlood/tank.maxBlood;//更新血量滑动条if(tank.currentBlood0)Destroy(collision.gameObject);//销毁坦克}}}7.2.2. Tank.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassTank:MonoBehaviour{publicfloatmoveSpeed5f;//移动速度publicfloatangularSpeed2f;//旋转角度publicintplayerNum1;//玩家编号publicintcurrentBlood;//当前血量publicintmaxBlood100;//最大血量publicGameObjectpreShellGo;//炮弹预设游戏对象publicSliderhpSlider;//血量滑动条privateTransformshootPoint;//发射位置privateRigidbodyrb;//刚体// Start is called before the first frame updatevoidStart(){currentBloodmaxBlood;rbGetComponentRigidbody();shootPointtransform.Find(ShootPoint);}// Update is called once per framevoidUpdate(){//如果按下空格键则发射炮弹if(playerNum1Input.GetKeyDown(KeyCode.Space)){Shoot();}elseif(playerNum2Input.GetKeyDown(KeyCode.P)){Shoot();}}privatevoidFixedUpdate(){Move();}/// summary/// 移动/// /summaryprivatevoidMove(){floatvInput.GetAxis(VerticalPplayerNum);floathInput.GetAxis(HorizontalPplayerNum);rb.velocitytransform.forward*v*moveSpeed;//前后移动rb.angularVelocitytransform.up*h*angularSpeed;//左右旋转}/// summary/// 发射炮弹/// /summaryprivatevoidShoot(){Instantiate(preShellGo,shootPoint.position,shootPoint.rotation);}}7.2.3. MainCamera.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassMainCamera:MonoBehaviour{publicTransformtank1;// 第一辆坦克的TransformpublicTransformtank2;// 第二辆坦克的TransformprivateVector3offset;// 摄像机相对于两辆坦克中心的偏移量privateCameramainCamera;// 主摄像机组件privatefloatdistance;// 两辆坦克之间的距离privatefloatcameraSize;// 正交摄像机的尺寸// Start is called before the first frame updatevoidStart(){// 检查是否正确赋值了两个坦克的Transformif(tank1null||tank2null)return;// 计算摄像机的初始偏移量Vector3tanksCenter(tank1.positiontank2.position)/2;offsettransform.position-tanksCenter;// 获取主摄像机组件mainCameraGetComponentCamera();}// Update is called once per framevoidUpdate(){// 如果任意一个坦克不存在则直接返回if(tank1null||tank2null)return;// 更新摄像机的位置Vector3tanksCenter(tank1.positiontank2.position)/2;transform.positiontanksCenteroffset;// 计算两辆坦克之间的距离distanceVector3.Distance(tank1.position,tank2.position);// 根据距离调整摄像机的正交尺寸cameraSizedistance*0.875f;mainCamera.orthographicSizecameraSize;}}7.3. 少量细节8. 音效8.1. 坦克静止、行驶音效调正摄像机位置靠近坦克使摄像机录制到坦克音效8.2. 坦克销毁音效8.3. 炮弹发射音效8.4. 炮弹爆炸音效8.5. 背景音乐