当前位置:   article > 正文

慕课英雄各个C#脚本分析_c#里的跳跃键

c#里的跳跃键

一、玩家移动脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class PlayerMove : MonoBehaviour {
  4. public float moveSpeed = 10.0f; //玩家移动速度
  5. public float rotateSpeed = 40.0f; //玩家旋转速度
  6. public float jumpVelocity = 2.0f; //玩家起跳速度

        //公有变量可以在U3D的脚本设定界面修改参数

  1.     private Animator animator; //玩家的Animator组件,用于控制玩家动画的播放
  2. private Rigidbody rigidbody; //玩家的刚体组件
  3. private float h; //获取玩家横轴输入
  4. private float v; //获取玩家纵轴输入
  5. private bool isGrounded;         //玩家是否在地面上
  6. private float groundedRaycastDistance = 0.1f; //表示向地面发射射线的射线长度
  1. //初始化,获取玩家组件
  2. void Start () {
  3. animator= GetComponent<Animator> (); //获取玩家Animator组件
  4.         rigidbody = GetComponent<Rigidbody>(); //获取玩家刚体组件
  5. }
  1. //每个固定时间执行一次,用于物理模拟
  2. void FixedUpdate()
  3. {
  4. //从玩家的位置垂直向下发出长度为射线,返回值表示玩家是否该射线是否碰撞到物体,该句代码用于检测玩家是否在地面上。三个参数分别是射线位置,射线方向,射线长度。
  5. isGrounded = Physics.Raycast(transform.position, -Vector3.up, groundedRaycastDistance);
  6. Jump(isGrounded); //调用跳跃函数
  7. }
  8. //跳跃函数,用于FixedUpdate()中调用
  9. void Jump(bool isGround)
  10. {
  11. //当玩家按下跳跃键Space,并且玩家在地面上时执行跳跃相关函数
  12. if (Input.GetKey(KeyCode.Space) && isGround)
  13. {
  14. //给玩家刚体组件添加向上的作用力,以改变玩家的运动速度,改变值为jumpVelocity
  15. rigidbody.AddForce(Vector3.up * jumpVelocity, ForceMode.VelocityChange);
  16. animator.SetBool("isJump", true); //设置动画参数,将isJump布尔型参数设置为true,播放玩家跳跃动画
  17. }
  18. else if(isGround) animator.SetBool("isJump", false); //设置动画参数,将isJump布尔型参数设置为false,停止播放玩家跳跃动画
  19. }
  1. //每帧执行一次,用于玩家的位移与旋转
  2. void Update () {
  3. float h = Input.GetAxisRaw("Horizontal"); //获取玩家水平轴上的输入,默认输入为ad与左右键
  4. float v = Input.GetAxisRaw("Vertical"); //获取玩家垂直轴上的输入,默认为sw与上下键
  5. MoveAndRotate(h, v); //根据玩家在水平、垂直轴上的输入,调用玩家的位移与旋转函数
  6. }
  7. //玩家的位移与旋转函数
  8. void MoveAndRotate(float h, float v)
  9. {
  10. //v>0表示获取玩家向前的输入,玩家以moveSpeed的速度向前运动
  11. if (v > 0) transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
  12. //v<0表示获取玩家向后的输入,玩家以moveSpeed的速度向后运动
  13. else if (v < 0) transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
  14. //若玩家垂直轴上有输入,则表示玩家进行位移,设置动画参数,将isMove布尔型参数设置为true,播放玩家奔跑动画
  15. if (v != 0.0f) animator.SetBool("isMove", true);
  16. //若玩家垂直轴上无输入,则表示玩家没有位移,设置动画参数,将isMove布尔型参数设置为false,停止播放玩家奔跑动画
  17. else animator.SetBool("isMove", false);
  18. //根据玩家水平轴的输入进行旋转,顺时针为正方向
  19. transform.Rotate(Vector3.up * h * rotateSpeed * Time.deltaTime);
  20. }
  21. }


二、玩家生命值脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class PlayerHealth : MonoBehaviour {
  4. public int health = 10; //玩家的生命值
  5. public bool isAlive = true; //玩家是否存活
  6. //每帧执行一次,检测玩家是否存活
  7. void Update () {
  8. if (health <= 0)
  9. isAlive = false;
  10. }
  11. //玩家扣血函数,用于GameManager脚本中调用,这个函数是公有的,需要被其他脚本调用。
  12. public void TakeDamage(int damage){
  13. health -= damage;
  14. if (health < 0)
  15. health = 0;
  16. }
  17. }


三、玩家攻击脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class PlayerAttack : MonoBehaviour {
  4. public int shootingDamage = 1; //玩家射击伤害
  5. public float shootingRange=50.0f; //玩家射击范围
  6. public AudioClip shootingAudio; //玩家射击音效
  7. public float timeBetweenShooting = 1.0f; //射击之间的最小时间间隔(玩家射击动画为1秒,为了使得动画正常播放,该值最好>=1.0f)
  8. private Animator animator; //玩家的Animator组件,用于控制玩家动画的播放
  9. private LineRenderer gunLine; //玩家的线渲染器组件,用于控制玩家开枪发出的激光射线效果
  10. private float timer; //攻击时间间隔,记录玩家从上次射击到现在经过的时间
  11. private Ray ray;
  12. private RaycastHit hitInfo; //发射的射线反馈的相关信息
  1. //初始化,获取对象组件,以及初始化变量
  2. void Start () {
  3. animator = GetComponentInParent<Animator>(); //获取玩家的Animator组件
  4. gunLine = GetComponent<LineRenderer>(); //获取玩家的线渲染器组件
  5. timer = 0.0f; //将攻击时间间隔清零
  6. }
  1. //每帧执行一次,用于玩家的射击行为
  2. void Update () {
  3. //当玩家按下攻击键J,并且攻击间隔大于射击之间的最小时间间隔,执行射击相关行为
  4. if (Input.GetKeyDown(KeyCode.J) && timer>timeBetweenShooting)
  5. {
  6. timer = 0.0f; //射击后将攻击时间间隔清零
  7. animator.SetBool("isShooting", true); //设置动画参数,将isShooting布尔型参数设置为true,播放玩家射击动画
  8. Invoke("shoot", 0.5f); //玩家举枪花费0.5s,0.5秒后调用shoot() 射击函数
  9. }
  10. //否则,表示射击条件未满足
  11. else
  12. {
  13. timer += Time.deltaTime; //更新攻击间隔,增加上一帧所花费的时间
  14. gunLine.enabled = false; //将线渲染器设为禁用
  15. animator.SetBool("isShooting", false); //设置动画参数,将isShooting布尔型参数设置为false,停止播放玩家射击动画
  16. }
  17. }
  18. //射击函数
  19. void shoot()
  20. {
  21. AudioSource.PlayClipAtPoint(shootingAudio, transform.position); //在枪口位置播放射击音效
  22. ray.origin = Camera.main.transform.position; //设置射线发射的原点:摄像机所在的位置
  23. ray.direction = Camera.main.transform.forward; //设置射线发射的方向:摄像机的正方向
  24. gunLine.SetPosition(0, transform.position); //设置线渲染器(开枪后的激光射线)第一个端点的位置:玩家枪械的枪口位置(本游戏对象)
  25. //发射射线,射线有效长度为shootingRange,若射线击中任何游戏对象,则返回true,否则返回false
  26. if (Physics.Raycast(ray, out hitInfo, shootingRange))
  27. {
  28. if (hitInfo.collider.gameObject.tag == "Enemy") //当被击中的游戏对象标签为Enemy,表明射线射中敌人
  29. {
  30. //获取该名敌人的EnemyHealth脚本组件
  31. EnemyHealth enemyHealth = hitInfo.collider.gameObject.GetComponent<EnemyHealth>();
  32. if (enemyHealth != null)
  33. {
  34. //调用EnemyHealth脚本的TakeDamage()函数,对敌人造成shootingDamage的伤害
  35. enemyHealth.TakeDamage(shootingDamage);
  36. }
  37. if(enemyHealth.health>0) //若敌人受伤且未死亡,敌人将会因受到攻击而被击退
  38. hitInfo.collider.gameObject.transform.position += transform.forward * 2;
  39. }
  40. gunLine.SetPosition(1, hitInfo.point); //当射线击中游戏对象时,将线渲染器(开枪后的激光射线)第二个端点设为射线击中游戏对象的点
  41. }
  42. //若射线未射中游戏对象,则将线渲染器(开枪后的激光射线)第二个端点设为射线射出后的极限位置
  43. else gunLine.SetPosition(1, ray.origin + ray.direction * shootingRange);
  44. gunLine.enabled = true; //将线渲染器(开枪后的激光射线)启用,显示玩家开枪后的效果。
  45. }
  46. }



四、敌人追踪脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class EnemyTrace : MonoBehaviour {
  4. public GameObject target; //敌人的追踪目标
  5. public float moveSpeed=8.0f; //敌人的移动速度
  6. public float minDist=2.2f; //追踪距离,当敌人与目标的距离小于等于该值时,敌人不再追踪目标
  7. private float dist; //敌人的坐标与玩家坐标的位置
  8. private Animator animator; //敌人的Animator组件
  9. private EnemyHealth enemyHealth; //敌人的生命值脚本
  10. //初始化,获取敌人的组件
  11. void Start () {
  12. animator = GetComponent<Animator> (); //获取敌人的Animator组件
  13. enemyHealth = GetComponent<EnemyHealth> (); //获取敌人的生命值脚本
  14. }
  15. //每帧执行一次,用于敌人追踪目标
  16. void Update () {
  17. if (enemyHealth!=null && enemyHealth.health <= 0) return; //当敌人死亡时,敌人无法追踪目标
  18. if (target == null) { //当追踪目标未设置时,敌人无法追踪目标
  19. animator.SetBool ("isStop", true); //设置动画参数,将布尔型参数isStop设为true:敌人未追踪目标,播放停驻动画
  20. return;
  21. }
  22. dist = Vector3.Distance (transform.position, target.transform.position); //计算敌人与追踪目标之间的距离
  23. //当游戏状态为游戏进行中(Playing)时
  24. if (GameManager.gm==null || GameManager.gm.gameState == GameManager.GameState.Playing) {
  25. if (dist > minDist) { //当敌人与目标的距离大于追踪距离时
  26. transform.LookAt (target.transform); //敌人面向追踪目标
  27. transform.eulerAngles=new Vector3(0.0f,transform.eulerAngles.y,0.0f); //设置敌人的Rotation属性,确保敌人只在y轴旋转
  28. transform.position +=
  29. transform.forward * moveSpeed * Time.deltaTime; //敌人以moveSpeed的速度向追踪目标靠近
  30. }
  31. animator.SetBool ("isStop", false); //设置动画参数,将布尔型参数isStop设为false:敌人追踪目标,播放奔跑动画
  32. }
  33. }
  34. }


五、敌人生命脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class EnemyHealth : MonoBehaviour {
  4. public int health=2; //敌人的生命值
  5. public int value=1; //玩家击杀敌人后所获得的分数
  6. public AudioClip enemyHurtAudio; //敌人的受伤音效
  7. private Animator animator; //敌人的Animator组件
  8. private Collider collider; //敌人的Collider组件
  9. private Rigidbody rigidbody; //敌人的rigidbody组件
  10. //初始化,获取敌人的组件
  11. void Start(){
  12. animator = GetComponent<Animator> (); //获取敌人的Animator组件
  13. collider = GetComponent<Collider> (); //获取敌人的Collider组件
  14. rigidbody = GetComponent<Rigidbody> (); //获取敌人的Rigidbody组件
  15. }
  16. //敌人受伤函数,用于PlayerAttack脚本中调用
  17. public void TakeDamage(int damage){
  18. health -= damage; //敌人受伤扣血
  19. if (enemyHurtAudio != null) //在敌人位置处播放敌人受伤音效
  20. AudioSource.PlayClipAtPoint (enemyHurtAudio, transform.position);
  21. if (health <= 0) { //当敌人生命值小于等于0时,表明敌人已死亡
  22. if (GameManager.gm != null) {
  23. GameManager.gm.AddScore (value);//玩家获得击杀敌人后得分
  24. }
  25. animator.applyRootMotion = true; //设置Animator组件的ApplyRootMotion属性,使敌人的移动与位移受动画的影响
  26. animator.SetTrigger ("isDead"); //设置动画参数,设置isDead的Trigger参数,播放敌人死亡动画
  27. collider.enabled = false; //禁用敌人的collider组件,使其不会与其他物体发生碰撞
  28. rigidbody.useGravity = false; //因为敌人的collider组件被禁用,敌人会因重力穿过地形系统下落,取消敌人受到的重力可以避免该现象
  29. Destroy (gameObject, 3.0f); //3秒后删除敌人对象
  30. }
  31. }
  32. }


六、敌人攻击脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. public class EnemyAttack : MonoBehaviour {
  4. public int damage=1; //敌人攻击造成的伤害值
  5. public float timeBetweenAttack=0.8f; //敌人攻击之间的最小间隔(敌人攻击动画约为0.8秒,为了使得动画正常播放,该值最好设为0.8秒)
  6. public AudioClip enemyAttackAudio; //敌人的攻击音效
  7. private float timer; //攻击时间间隔,记录敌人从上次攻击到现在经过的时间
  8. private Animator animator; //敌人的Animator组件,用于控制敌人动画的播放
  9. private EnemyHealth enemyHealth; //敌人的生命值脚本
  10. //初始化,获取对象组件,以及变量初始化
  11. void Start(){
  12. timer = 0.0f; //将攻击时间间隔初始化
  13. animator = GetComponent<Animator> (); //获取敌人的Animator组件
  14. enemyHealth = GetComponent<EnemyHealth> (); //获取敌人的生命值脚本
  15. }
  16. //与勾选了isTrigger属性的COllider组件共同用于检测:是否有物体进入敌人的攻击范围
  17. void OnTriggerStay(Collider collider){
  18. if (enemyHealth.health <= 0) //若敌人生命值小于等于0,则说明敌人已经死亡,不具备攻击能力
  19. return;
  20. //当攻击间隔大于敌人攻击之间的最小间隔,且进入敌人攻击范围的对象标签是玩家时
  21. if (timer>=timeBetweenAttack && collider.gameObject.tag == "Player") {
  22. //当游戏状态为游戏进行中(Playing)时
  23. if(GameManager.gm==null || GameManager.gm.gameState==GameManager.GameState.Playing){
  24. timer=0.0f; //攻击后将攻击时间间隔清零
  25. animator.SetBool ("isAttack", true); //设置动画参数,将isAttack布尔型参数设置为true,播放敌人攻击动画
  26. if(enemyAttackAudio!=null) //在敌人位置处播放敌人的攻击音效
  27. AudioSource.PlayClipAtPoint(enemyAttackAudio,transform.position);
  28. if (GameManager.gm != null)
  29. GameManager.gm.PlayerTakeDamage (damage);//通过GameManager游戏管理类实现玩家扣血的效果
  30. }
  31. }
  32. }
  33. //与勾选了isTrigger属性的COllider组件共同用于检测:是否有物体离开敌人的攻击范围
  34. void OnTriggerExit(Collider collider){
  35. //若离开敌人攻击范围的物体标签是玩家时
  36. if (collider.gameObject.tag == "Player")
  37. animator.SetBool ("isAttack", false); //设置动画参数,将isAttack布尔型参数设置为false,停止播放敌人攻击动画
  38. }
  39. //每帧执行一次,更新攻击间隔
  40. void Update(){
  41. timer += Time.deltaTime; //更新攻击间隔,增加上一帧所花费的时间
  42. }
  43. }


七、游戏控制脚本

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. using UnityEngine.SceneManagement;
  5. public class GameManager : MonoBehaviour {
  6. static public GameManager gm; //静态游戏管理器,场景中唯一的游戏管理器实例
  7. public GameObject player; //玩家对象
  8. private PlayerHealth playerHealth; //玩家的生命值脚本
  9. public int TargetScore=10; //游戏获胜的目标分数
  10. private int currentScore; //游戏当前得分
  11. //游戏状态枚举,分别表示游戏进行(Playing)、游戏失败(GameOver)、游戏胜利(Winning)
  12. public enum GameState {Playing,GameOver,Winning};
  13. public GameState gameState; //游戏状态变量
  14. public Text scoreText; //GUI控件,用于显示当前游戏得分的文本信息
  15. public Text healthText; //GUI控件,用于显示玩家当前的生命值
  16. //初始化,获取相关组件,并初始化变量
  17. void Start () {
  18. //初始化游戏管理器类
  19. gm = GetComponent<GameManager> ();
  20. //根据标签获取玩家对象
  21. if (player == null)
  22. player = GameObject.FindGameObjectWithTag ("Player");
  23. //游戏开始前初始化变量
  24. currentScore = 0;
  25. //获取玩家对象的玩家生命值脚本
  26. playerHealth = player.GetComponent<PlayerHealth> ();
  27. }
  28. //每帧执行一次,用于游戏状态的检测与切换,以及处理当前游戏状态需要执行的语句
  29. void Update () {
  30. switch (gameState) { //根据当前游戏状态来决定要执行的语句
  31. //当游戏状态为游戏进行中(Playing)状态时
  32. case GameState.Playing:
  33. scoreText.text = "Score:" + currentScore; //将显示当前游戏得分的文本信息更改为“Score:分数”
  34. healthText.text = "Health:" + playerHealth.health; //将显示玩家当前生命值的文本信息更改为“Health:生命值”
  35. //若玩家死亡,游戏状态更改为游戏失败(GameOver)
  36. if (playerHealth.isAlive == false)
  37. gm.gameState = GameState.GameOver;
  38. //若当前得分大于目标分数,游戏状态更改为游戏胜利(Winning)
  39. else if (currentScore >= TargetScore)
  40. gm.gameState = GameState.Winning;
  41. break;
  42. //当游戏状态为游戏胜利(Winning)状态时
  43. case GameState.Winning:
  44. SceneManager.LoadScene("level1"); //加载场景level1
  45. break;
  46. //当游戏状态为游戏失败(GameOver)状态时
  47. case GameState.GameOver:
  48. SceneManager.LoadScene("level1"); //加载场景level1
  49. break;
  50. }
  51. }
  52. //玩家击杀得分
  53. public void AddScore(int value){
  54. currentScore += value;
  55. }
  56. //玩家受伤扣血
  57. public void PlayerTakeDamage(int value){
  58. if (playerHealth != null)
  59. playerHealth.TakeDamage(value);
  60. }
  61. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/878749
推荐阅读
相关标签
  

闽ICP备14008679号