让背景图片移动,营造一种人物在跑动的效果;

背景图片向左运动,将脚本moveLeft挂载到背景图片上,创建新的脚本BGRepeat,实现背景图片的循环,如何确定背景图片,从哪里开始回到初始位置呢?

为背景图片添加碰撞体,通过碰撞体组件的size的x值来确定,(x值的二分之一)设置repestWidth变量

 1 public class BGRepeat : MonoBehaviour
 2 {
 3     
 4     Vector3 startPos;
 5     //设置一个值,判断位置x是多少的时候,返回原来的位置
 6     float repeatWidth;
 7     // Start is called before the first frame update
 8     void Start()
 9     {
10         //获取刚开始的位置
11         startPos = transform.position;
12         //变量赋值,获取组件
13         repeatWidth = GetComponent<BoxCollider>().size.x / 2;
14     }
15 
16     // Update is called once per frame
17     void Update()
18     {
19         if (transform.position.x < startPos.x - repeatWidth) {
20             transform.position = startPos;
21         }
22     }
23 }

人物撞到障碍物之后,Game over;对地面和障碍物的预制体添加标签;当触碰到障碍物的时候,在console中显示gameover

 1 public class playerController : MonoBehaviour
 2 {
 3     private Rigidbody rb;
 4     public  float jumpForce;
 5     public float gravityModifier;
 6     public bool isGround;//默认是false;
 7     public bool isGameOver;
 8     // Start is called before the first frame update
 9     void Start()
10     {
11         rb = GetComponent<Rigidbody>();
12         //增加物体本身的重力,加快回落的速度
13         Physics.gravity *= gravityModifier;
14     }
15 
16     // Update is called once per frame
17     void Update()
18     {
19         if (Input.GetKeyDown(KeyCode.Space)&&isGround) {
20             rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
21             isGround = false;
22 
23         }
24        
25     }
26     //刚刚触碰物体时
27     private void OnCollisionEnter(Collision other)//除本身之外碰撞的物体
28     {
29         //通过地面标签获取
30         if (other.gameObject.CompareTag("Ground"))
31         {
32             isGround = true;
33         }
34         //通过障碍物的标签获取,触碰到障碍物的时候,游戏结束,在console中显示Game Over
35         if (other.gameObject.CompareTag("Obstacle")) {
36             isGameOver = true;
37             Debug.Log("Game Over!!");
38         }
39     }
40 }

当人物碰撞到障碍物,游戏结束时,障碍物的生成和移动停止,背景图片的移动也停止

一个脚本中,也可以访问另一个脚本的变量;脚本可以本当作组件,被另一个脚本进行访问,可以访问里面的变量等;

 1 public class moveLeft : MonoBehaviour
 2 {
 3     //playerController脚本可以看作是一个组件
 4     private playerController playerController;
 5 
 6     public float speed ;
 7     // Start is called before the first frame update
 8     void Start()
 9     {
10         //这样也可以获得playerController的控制权,但太长了,一般不使用
11         // playerController = GameObject.Find("Player").GetComponent<playerController>();
12         //常用这个方法来获得playerController的控制权
13         playerController = FindObjectOfType<playerController>();
14     }
15 
16     // Update is called once per frame
17     void Update()
18     {
19         // Time.deltaTime 时间的修订,在不同的设备上,保持一致
20         //Vector3.left*speed 以一个速度向左移动
21         if (!playerController.isGameOver) {
22             transform.Translate(Vector3.left * speed * Time.deltaTime);
23         }
24         
25     }
26 }

同时让障碍物不再生成,方法与背景不再移动,障碍物不在移动,方法相同;

 1 public class spawnManager : MonoBehaviour
 2 {
 3     private playerController playerController;
 4 
 5     public GameObject obstaclePrefab;//循环产生障碍物的预制体
 6     public Vector3 spawnPos = new Vector3(20, 0, 0);
 7     public float starDelay, repeatRate;
 8     // Start is called before the first frame update
 9     void Start()
10     {
11         //复制产生(函数:产生复制的障碍物,开始延迟时间,重复率)
12         InvokeRepeating("SpawnObstacle",starDelay,repeatRate);
13         playerController = FindObjectOfType<playerController>();
14     }
15 
16     // Update is called once per frame
17     void Update()
18     {
19         
20     }
21     //生成多个障碍物
22     public void SpawnObstacle()
23     {
24         if (!playerController.isGameOver) {
25             //生成函数(生成的物体,生成的坐标,以怎样的方向生成);
26             Instantiate(obstaclePrefab, spawnPos, Quaternion.identity);
27         }
28         
29     }
30 }

人物跳过障碍物后,销毁障碍物

 1 public class moveLeft : MonoBehaviour
 2 {
 3     //playerController脚本可以看作是一个组件
 4     private playerController playerController;
 5 
 6     public float speed ;
 7     //设置左侧边界,销毁已经跳过的障碍物
 8     public float leftBound;
 9     // Start is called before the first frame update
10     void Start()
11     {
12         //这样也可以获得playerController的控制权,但太长了,一般不使用
13         // playerController = GameObject.Find("Player").GetComponent<playerController>();
14         //常用这个方法来获得playerController的控制权
15         playerController = FindObjectOfType<playerController>();
16     }
17 
18     // Update is called once per frame
19     void Update()
20     {
21         // Time.deltaTime 时间的修订,在不同的设备上,保持一致
22         //Vector3.left*speed 以一个速度向左移动
23         if (!playerController.isGameOver) {
24             transform.Translate(Vector3.left * speed * Time.deltaTime);
25         }
26         //小于左侧边界并且标签为Obstacle,有标签是因为背景上也挂载了该脚本
27         if (transform.position.x < leftBound && gameObject.CompareTag("Obstacle")) {
28             Destroy(gameObject);
29         }
30         
31     }
32 }