1.建立场景,编写控制主角移动代码(此代码放在主角身上)。摄像机调整好角度后直接放在主角中;关于主角仍需要添加刚体和碰撞器,并进行一等调整。(如下图所示)
![](https://img-blog.csdnimg.cn/7535ac0769ee4f1099d1ce8684624e23.png)
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)
![](https://img-blog.csdnimg.cn/52c639b17b374f458e5fb68c6a917d87.png)
![](https://img-blog.csdnimg.cn/f79a32c8652e4a43bb98e2d5891133c4.png)
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文本需要创建(如何创建可看之前吃金币或综合游戏,然后就是编写代码)
![](https://img-blog.csdnimg.cn/2be620b224e1489a88398c2bafdc4a08.png)
![](https://img-blog.csdnimg.cn/9c13821b30a44a919c8be615c62ccfce.png)
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));
}*/
}