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

文章目录

  • 物体跳上某支撑物,跟随移动,以及之后脱离的实现
  • 无限随机地图的实现
    • 给管理地图的家伙装载脚本

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

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

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

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

当我们和支撑物接触时 (河流设置了 “water” 标签, 青蛙设置了 “Wood” 标签):

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

   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;

            }
         }
      }
   }

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

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

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

完成!

无限随机地图的实现

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

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

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

脚本如下:

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

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

    ///
    /// 检测是否和相机距离过小
    ///
    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();
        }
    }

    ///
    /// 地图的随机生成
    ///
    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 函数。

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

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

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

做些准备工作:

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

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

放好准备好的场景:

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

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

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

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

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

你可能感兴趣的:(unity游戏开发,unity,游戏引擎)