让背景图片移动,营造一种人物在跑动的效果;
背景图片向左运动,将脚本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 }