制作跑酷小游戏

1.建立场景,编写控制主角移动代码(此代码放在主角身上)。摄像机调整好角度后直接放在主角中;关于主角仍需要添加刚体和碰撞器,并进行一等调整。(如下图所示)

主角的组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    //A、D控制主角左右移动   空格或W控制主角跳跃   主角一直跑
    public  GameObject player;
    public float Movespeed = 5f;
    public float Jumpspeed = 50f;
    public static float RunSpeed;
    private void Start()
    {
        RunSpeed = 10f;
    }

    void Update()
    {
        UserInterface();//调用函数,执行
        AlwaysMove();
    }
    void UserInterface()//检测用户交互
    {
        float LeftrightValue = Input.GetAxis("Horizontal");//用户输入A D得到-1和+1
        PlyHoriMove(LeftrightValue);//形参传递,调用函数
        if(Input .GetKey(KeyCode.W))
        {
            Jump();
        }
        
    }
    void PlyHoriMove(float HoriValue)//使用,接,名字可以和上边不一样;控制角色左右移动
    {
        player.transform.Translate(HoriValue * Movespeed * Time.deltaTime,0, 0);
    }
    void Jump()//控制角色跳跃
    {
        player.transform.Translate(new Vector3(0, Jumpspeed * Time.deltaTime, 0));
    }
    void AlwaysMove()//使角色一直向前跑
    {
       // Debug.Log("角色一直跑");
        player.transform.Translate(new Vector3(0, 0, 1 * RunSpeed *Time .deltaTime ));
    }
}

2.编写克隆金币与障碍物的代码(此代码给主角)。在此需要搭建场景,在道路上搭建两个立方体(一个是克隆金币,另一个是克隆障碍物,此处需要加上is trigger,为触发器),只需要留下碰撞器(具体做法如图所示);建一个球作为金币模板(金币需要设置成触发器),为了方便加分,需要在最初就将金币指定标签(在inspect中点击Tag,然后点击下面的Add Tag,为其添加新的标签,然后返回为标签Tag选择新建的需要的标签,有关分标签很容易出错,说不准无法复制什么的可能就是这个原因,所以一定要看好)(关于其中的加速带是触发器哦,一定要点选is trigger)

触发器组件的删改
碰撞变触发

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

public class CloneCollision : MonoBehaviour
{
    //触发检测 1.克隆金币 2.克隆障碍物 3.碰撞吃金币 4.碰到障碍物,掉血 5.碰到加速带,加速、减速
    GameObject BeiTriggOBj;//声明变量,存储other
    public GameObject Coinmuban;//金币模板
    public Transform CoinParent;//克隆金币存储地
    public GameObject Obstaclemuban;
    public Transform ObstacleParent;//克隆障碍物存储地


    //PlayerControl onePlayshizhe=new PlayerControl ();//需要new赋值实例化对象可以访问public方法变量()不能改变除非点一下,PlayerControl是一个脚本(必须有这个代码)
    private void OnTriggerEnter(Collider other)//只能执行一次,如果是stay会一直执行;当我触发到别人,就把别人的碰撞器存在other里面
    {
        BeiTriggOBj = other.transform.gameObject;//存储other,此举是将collider类型的other转化为GameObject类型的
        if(BeiTriggOBj .tag == "Cointrigger")//克隆金币
        {
            CloneCoin();//调用函数
        }
        if (BeiTriggOBj.tag == "Obstacletrigger")//克隆障碍物
        { 
            CloneObstacle();
        }
        if (BeiTriggOBj.tag == "SpeedUpTrigger")//开始加速
        {
            SpeedUp(10f);
        }
        if (BeiTriggOBj.tag == "Coin")//吃金币  加分
        {
            Debug.Log("开始加分");
            ScoreManager.ScoreAdd();
            Destroy(BeiTriggOBj);
        }
    }
    private void OnCollisionEnter(Collision Other)
    {
        if (Other.transform .gameObject .tag == "Obstacle")//掉血
        { 
            ScoreManager.SubBlood();
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if(other .transform .gameObject .tag == "SpeedUpTrigger")//离开加速带,速度-10,恢复之前的
        {
            SpeedUp(-10f);
        }
    }
    void CloneCoin()
    {
        for (int i = 0; i < 10; i++)//克隆多个,这里是10个,i++是金币往前复制不重叠
        {
            Vector3 clonePosition = new Vector3(155 , 2f, BeiTriggOBj.transform.position.z + 50 + i * 3);//此处x的坐标点是存触发器x轴的坐标点(单独一个数是固定的),Randon.Range(,)是几到几之间随机生成,*3是觉得+1太小了(这里是将坐标提前设置好
            Debug.Log("开始克隆金币");
            GameObject.Instantiate(Coinmuban, clonePosition, Quaternion.Euler(0, 0, 0), CoinParent);//Quaternion四元数,使其克隆时不旋转
        }

    }
    void CloneObstacle()
    {
        Vector3 CloOBSPos = new Vector3(156, -150f, BeiTriggOBj.transform.position.z + 150);
        Debug.Log("开始克隆障碍物");
        GameObject.Instantiate(Obstaclemuban, CloOBSPos, Quaternion.Euler(0, 0, 0), ObstacleParent);
    }
    void SpeedUp(float Speed)
    {
        Debug.Log("加速");
        PlayerControl.RunSpeed += Speed;//这个.改变的只能是静态的,使其在原有状态+10
    }
}

3.编写加分掉血代码(此代码我给了主角)。显示分数UI文本需要创建(如何创建可看之前吃金币或综合游戏,然后就是编写代码)

矩形框显示
文本显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SocialPlatforms.Impl;

public class ScoreManager : MonoBehaviour
{
    // 加分掉血   碰到金币加分  碰到障碍物掉血
    //此脚本有两种方式显示加分,掉血。一是文本框,二是矩形框。(最好任选其一,要不调整位置以防覆盖;如果不需要UI文本框,需要注释掉,并且外边不显示)
    public GameObject Score;
    public static TMP_Text score1;
    public GameObject blood;
    public static TMP_Text blood1;
    public static int CurrentScore = 0;
    public static int CurrentBlood = 10000;
    private void Start()//加分掉血初始化,初始化归零
    {
        Score = GameObject.Find("Score");
        score1 = Score.GetComponent<TMP_Text >();//获取组件
        blood = GameObject.Find("blood");
        blood1 = blood.GetComponent<TMP_Text>();//获取组件
        CurrentScore = 0;
        CurrentBlood = 10000;
    }
    public static void ScoreAdd()
    {
        Debug.Log("开始加分");
        CurrentScore += 1;
        Debug.Log("分:" + CurrentScore);
        score1.text  = "分:" + CurrentScore.ToString();//显示内容
    }
    public static void SubBlood()
    {
        Debug.Log("开始掉血");
        CurrentBlood -= 100;
        Debug.Log("血:" + CurrentBlood );
        blood1.text = "血:" + CurrentBlood.ToString();//显示内容
    }
    /*private void OnGUI()//这个是矩形框显示加分掉血
    {
        Rect oneLableRec = new Rect(100, 100, 50, 50);
        GUILayout.Box(CurrentBlood.ToString(), GUILayout.Width(200), GUILayout.Height(50), GUILayout.ExpandWidth(false ));
        // 创建另一个矩形框,背景色为红色,边框宽度为3像素
        GUILayout.Box(CurrentScore.ToString(), GUILayout.Width(200), GUILayout.Height(70), GUILayout.ExpandWidth(false  ));
        GUILayout.TextField("", GUILayout.Width(200), GUILayout.Height(50), GUILayout.ExpandWidth(false));
    }*/
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值