A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aisini 金牌黑马   /  2014-7-29 19:39  /  1469 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

脚本用法:
   先给你的player绑定一个CharacterController组件
   按住shift可加速跑动,Tab键盘切换战斗状态
    由于很多动作都没有,例如向左跑,向右跑,这里用向前跑来代替了
  1. using UnityEngine;
  2. using System.Collections;

  3. public class PlayerMovement : MonoBehaviour {
  4.     //是否战斗姿态
  5.     public bool isAttackStand =false;
  6.     //是否可以移动;
  7.     public bool steering = true;
  8.      
  9.     public void PlayerAllowMove(bool steer){
  10.         steering =steer;
  11.     }
  12.     //行走初始速度;
  13.     public float walkSpeed = 20.0f;
  14.     //跑的速度;
  15.     public float runSpeed = 60.0f;
  16.     //是否在行走;
  17.     public bool isWalking = true;
  18.     //是否在攻击;
  19.     public bool isAttacking = false;
  20.      
  21.     public void setAttacking(bool isAttack){
  22.         isAttacking = isAttack;
  23.         if(isAttack){
  24.             isAttackStand = true;
  25.         }
  26.     }
  27.     //是否在地上;
  28.     private bool grounded = true;
  29.     //移动速度;
  30.     private float moveSpeed = 0.0f;
  31.     //行走的方向;
  32.     private Vector3 moveDirection= Vector3.zero;
  33.     //重力
  34.     public float gravity = 50.0f;
  35.     //获取人物动画组件;
  36.     Animation playerAnimation;
  37.     //
  38.     private CharacterController controller;
  39.      
  40.     public enum MovementState{
  41.         Walk,
  42.         WalkForward,
  43.         WalkLeftSlide,
  44.         WalkRightSlide,
  45.         WalkBack,
  46.         WalkLeft,
  47.         WalkRight,
  48.          
  49.         Run,
  50.         RunForward,
  51.         RunLeftSlide,
  52.         RunRightSlide,
  53.         RunBack,
  54.         RunLeft,
  55.         RunRight,
  56.          
  57.         AttackStand,
  58.         Idle
  59.     }
  60.     private MovementState movementState = MovementState.Idle;
  61.      
  62.      
  63.      
  64.     void Awake(){
  65.         //程序开启前,获取人物动画组件;
  66.         playerAnimation = GetComponent <Animation>() as Animation;
  67.         //获取人物的CharacterController组件;
  68.         controller = GetComponent<CharacterController>() as CharacterController;
  69.     }
  70.      
  71.     // Use this for initialization
  72.     void Start () {
  73.         playerAnimation["Idle"].layer = -1;
  74.         playerAnimation["AttackStandy"].layer = -1;
  75.         playerAnimation["Walk"].layer = -1;
  76.         playerAnimation["Run"].layer = -1;
  77.     }
  78.      
  79.     // Update is called once per frame
  80.     void Update () {
  81.         if(steering){
  82.             if(grounded){
  83.                 if(isAttackStand==false){
  84.                     movementState = MovementState.Idle;
  85.                 }else{
  86.                     movementState = MovementState.AttackStand;
  87.                 }
  88.                 if(Input.GetAxis("Vertical")!=0||Input.GetAxis("Horizontal")!=0){
  89.                     Vector3 MoveForward = transform.TransformDirection(Vector3.forward);
  90.                     if(isWalking){
  91.                         //走路动作
  92.                         if(Input.GetAxis("Vertical") > 0){
  93.                             movementState = MovementState.WalkForward;
  94.                         }else if(Input.GetAxis("Vertical") < 0){
  95.                             movementState = MovementState.WalkBack;
  96.                         }
  97.                         
  98.                         if(Input.GetAxis("Horizontal")>0){
  99.                             if(Input.GetAxis("Vertical") > 0){
  100.                                 movementState = MovementState.WalkRightSlide;
  101.                             }else{
  102.                                 movementState = MovementState.WalkRight;
  103.                             }
  104.                         }else if(Input.GetAxis("Horizontal") < 0){
  105.                             if(Input.GetAxis("Vertical") > 0){
  106.                                 movementState = MovementState.WalkLeftSlide;
  107.                             }else{
  108.                                 movementState = MovementState.WalkLeft;
  109.                             }
  110.                         }
  111.                     }else{
  112.                         //跑动动作
  113.                         if(Input.GetAxis("Vertical") > 0){
  114.                             movementState = MovementState.RunForward;
  115.                         }else if(Input.GetAxis("Vertical") < 0){
  116.                             movementState = MovementState.RunBack;
  117.                         }
  118.                         
  119.                         if(Input.GetAxis("Horizontal")>0){
  120.                             if(Input.GetAxis("Vertical") > 0){
  121.                                 movementState = MovementState.RunRightSlide;
  122.                             }else{
  123.                                 movementState = MovementState.RunRight;
  124.                             }
  125.                         }else if(Input.GetAxis("Horizontal") < 0){
  126.                             if(Input.GetAxis("Vertical") > 0){
  127.                                 movementState = MovementState.RunLeftSlide;
  128.                             }else{
  129.                                 movementState = MovementState.RunLeft;
  130.                             }
  131.                         }
  132.                     }
  133.                 }
  134.             }
  135.             movementLogic();
  136.             GetSpeed();
  137.             moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
  138.             moveDirection = transform.TransformDirection(moveDirection);
  139.             moveDirection *= moveSpeed;
  140.             moveDirection.y -= gravity * Time.deltaTime;
  141.             
  142.             var flags = controller.Move(moveDirection * Time.deltaTime);
  143.             grounded = (flags & CollisionFlags.Below) != 0;
  144.             //切换是否战斗状态;
  145.             if(Input.GetKeyUp(KeyCode.Tab)){
  146.                 isAttackStand = !isAttackStand;
  147.             }
  148.             //按下左shift键切换跑步;
  149.             if(Input.GetKeyDown(KeyCode.LeftShift)){
  150.                 isWalking = false;
  151.             }
  152.             //弹起左shift切换为走路;
  153.             if(Input.GetKeyUp(KeyCode.LeftShift)){
  154.                 isWalking = true;
  155.             }
  156.         }
  157.         //永远面向摄像机方向;
  158.         transform.rotation = Quaternion.Euler(0,Camera.main.transform.eulerAngles.y,0);
  159.     }
  160.      
  161.     void movementLogic(){
  162.         if (movementState == MovementState.Idle){
  163.             playerAnimation.CrossFade("Idle", 0.15f);
  164.         }else if (movementState == MovementState.AttackStand){
  165.             playerAnimation.CrossFade("AttackStandy", 0.15f);
  166.         }else if (movementState == MovementState.WalkForward){
  167.             playerAnimation.CrossFade("Walk", 0.15f);
  168.             //控制前进播放;
  169.             playerAnimation["Walk"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
  170.         }else if (movementState == MovementState.WalkBack){
  171.             playerAnimation.CrossFade("Walk", 0.15f);
  172.             //控制后退播放;
  173.             playerAnimation["Walk"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
  174.         }else if (movementState == MovementState.WalkLeft){
  175.             playerAnimation.CrossFade("Walk", 0.15f);
  176.         }else if (movementState == MovementState.WalkRight){
  177.             playerAnimation.CrossFade("Walk", 0.15f);
  178.         }else if (movementState == MovementState.WalkLeftSlide){
  179.             playerAnimation.CrossFade("Walk", 0.15f);
  180.         }else if (movementState == MovementState.WalkRightSlide){
  181.             playerAnimation.CrossFade("Walk", 0.15f);
  182.         }else if (movementState == MovementState.RunForward){
  183.             playerAnimation.CrossFade("Run", 0.15f);
  184.             //控制前进播放;
  185.             playerAnimation["Run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
  186.         }else if (movementState == MovementState.RunBack){
  187.             playerAnimation.CrossFade("Run", 0.15f);
  188.             //控制后退播放;
  189.             playerAnimation["Run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
  190.         }else if (movementState == MovementState.RunLeft){
  191.             playerAnimation.CrossFade("Run", 0.15f);
  192.         }else if (movementState == MovementState.RunRight){
  193.             playerAnimation.CrossFade("Run", 0.15f);
  194.         }else if (movementState == MovementState.RunLeftSlide){
  195.             playerAnimation.CrossFade("Run", 0.15f);
  196.         }else if (movementState == MovementState.RunRightSlide){
  197.             playerAnimation.CrossFade("Run", 0.15f);
  198.         }
  199.     }
  200.      
  201.     float GetSpeed () {
  202.         if (movementState == MovementState.Idle){
  203.             moveSpeed = 0;
  204.         }else if(movementState == MovementState.WalkForward){
  205.             moveSpeed = walkSpeed;
  206.         }else if(movementState == MovementState.WalkBack||movementState == MovementState.WalkRight||movementState == MovementState.WalkRightSlide||movementState == MovementState.WalkLeft||movementState == MovementState.WalkLeftSlide){
  207.             moveSpeed = walkSpeed*0.95f;
  208.         }else if(movementState == MovementState.RunForward){
  209.             moveSpeed = runSpeed;
  210.         }else if(movementState == MovementState.RunBack||movementState == MovementState.RunRight||movementState == MovementState.RunRightSlide||movementState == MovementState.RunLeft||movementState == MovementState.RunLeftSlide){
  211.             moveSpeed = runSpeed*0.95f;
  212.         }
  213.         if(isAttacking==true){
  214.             moveSpeed = 1.0f;
  215.         }
  216.         return moveSpeed;
  217.     }
  218. }
复制代码




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马