Unity-物体跳上某支撑物,跟随移动,以及之后脱离的实现 && 无限地图的实现

  • Post author:
  • Post category:其他




物体跳上某支撑物,跟随移动,以及之后脱离的实现


思路:将玩家操控的对象临时变成该支撑物的子级,然后在玩家操控的物体继续移动时,解除玩家操控的对象和支撑物的关系

在我们操控的主角的代码中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbZ53q4v-1680090882854)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230328160422230.png)]

当我们和支撑物接触时 (

河流设置了 “water” 标签, 青蛙设置了 “Wood” 标签

):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPuu1iLQ-1680090882856)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230328163341881.png)]

   private void OnTriggerStay2D(Collider2D other) 
   {
      if(other.CompareTag("Water") && !isJump)
      {
         //判断该范围内的碰撞体(发射点,向哪里发射,结果返回)
         Physics2D.RaycastNonAlloc(transform.position + Vector3.up * 0.1f, Vector2.zero, result);   
         
         foreach(var hit in result) 
         {
            if (hit.collider == null) continue;
            //如果射线检测发现有带有Wood标签的碰撞体
            if (hit.collider.CompareTag("Wood"))
            {
               //成为木板的子级
               transform.parent = hit.collider.transform;

            }
         }
      }
   }

我们把拖出的方法写在跳跃动画开始的函数里:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNMB2jyo-1680090882856)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230328165111740.png)]

   public void JumpAnimationEvent() {
      isJump = true;
      //青蛙跳的时候处于最上面的图层
      sr.sortingLayerName = "front";
      //解除它的父级
      transform.parent = null;
   }

完成!



无限随机地图的实现


思路:建立一个管理地图生成的对象,然后判断它和相机的距离(相机和角色位置绑定的情况下)一旦小于多少,就生成地图



给管理地图的家伙装载脚本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SaAUrn9X-1680090882857)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230329094640034.png)]

脚本如下:

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

public class TerrainManagerController : MonoBehaviour
{
    //存想无限生成的东西
    public List<GameObject> terrainObjects;
    //和相机保持的距离
    public float offSetY;
    //上次的随机数
    private int lastIndex;

    ///<summary>
    /// 检测是否和相机距离过小
    ///</summary>
    private void CheckPosition() 
    {
        if (transform.position.y - Camera.main.transform.position.y < offSetY / 2)
        {   
            //和相机保持距离
            transform.position = new Vector3(0, Camera.main.transform.position.y + offSetY, 0);
            //随机生成地图
            SpawnTerrain();
        }
    }

    ///<summary>
    /// 地图的随机生成
    ///</summary>
    private void SpawnTerrain() {
        //随机我们指定的一堆物品的一个数 (随机[0, 数组长度)
        int index = Random.Range(0, terrainObjects.Count);
        //避免重复生成地形
        while (index == lastIndex) 
        {
            index = Random.Range(0, terrainObjects.Count);
        }
        //unity准备的随机生成函数 (生成什么,生成位置,是否旋转,父级位置)
        GameObject target = Instantiate(terrainObjects[index], transform.position, Quaternion.identity);
        lastIndex = index;
    }
}

然后在操控的角色每次前进动画放完最后几帧的帧函数里启动这个距离检测

CheckPosition

函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mkErP7v-1680090882859)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230329103834189.png)]

   //地图生成对象
   public TerrainManagerController terrainObeject;
   //青蛙是否死亡
   private bool isdead;
  
   /// <summary>
   /// 跳跃结束的帧函数
   /// </summary>
   public void FinshJumpAnimationEvent() {
      isJump = false;
      //跳完处于底层
     sr.sortingLayerName = "center";

     if (dir == Direction.Up && !isdead) 
     {
        terrainObeject.CheckPosition();
     }
   }

做些准备工作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NJjAKiAv-1680090882860)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230329104138122.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KweOwfkM-1680090882861)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230329104200314.png)]

放好准备好的场景:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eP4eG5q-1680090882862)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230329110251472.png)]

这样,无限生成地图就实现了。

优化:删除已经经过的地图

public class Block : MonoBehaviour
{
    void Update()
    {
        checkPosition();
    }
    
    ///<summary>
    ///是否该删除
    ///</summary>
    private void checkPosition () 
    {
        if (Camera.main.transform.position.y - transform.position.y > 25)
        {
            Destroy(this.gameObject);
        }
    }
}

将它挂到那些我们生成的场景里,问题就解决了。



版权声明:本文为abaidaye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。