其实呢,我这游戏就有一个简单的AI框架,其他的呢我就一起走了吧,写的还是挺乱的。
比较重要的就是玩家控制类PlayerController~~~
这里其实我把几个模块都写在一起了,比如输入控制(InputController),动画控制(AnimatorController),还有角色控制
因为就是一个练手的,不用把各个平台的输入信息都整合了,所以InputController就不写了。
我感觉动画控制和角色控制的分界线很微妙,所以也就写一起了~ 走代码备注很全
//人物控制脚本 public class PlayerController : MonoBehaviour { private Animator mAnimator; //自身Animator private CharacterController mCController; //人物控制器 public GameObject Boom; //技能爆炸特效 public GameObject Boom2; //技能爆炸特效2 (这两个不应该写在人物控制里,应该写在技能脚本中) private bool show = true; //控制技能释放 (同上) private int num = -1; //技能计时 (同上) private bool CanAnimation = true; //是否允许动画运行 void Awake () { //初始化 mAnimator = GetComponent<Animator>(); //获取自身Animator mCController = GetComponent<CharacterController>(); //获取自身人物控制器 } void ShowBoom() //展示基本爆炸特效 { GameObject boom = Instantiate(Boom) as GameObject; boom.transform.position = transform.position + transform.forward * 1.3f; boom.transform.localScale = Vector3.one; SphereCollider co = GetComponent<SphereCollider>(); co.enabled = true; } IEnumerator skillTime() //技能CD计时函数 { yield return new WaitForSeconds(1); Num.Instance.set(num); num--; if (num >= 0) StartCoroutine(skillTime()); } void OnTriggerEnter(Collider other) //Trigger触发器,受伤害触发 { if (other.gameObject.tag.Equals("MosterAttack")) //技能在MosterAttack的标签里 { GetComponent<Life>().DelHP(10); //Life脚本控制血量,减少10血量 } } void Update () { CanAnimation = true; float h = Input.GetAxis("Horizontal"); //获取水平输入 float v = Input.GetAxis("Vertical"); //获取竖直输入 //获取鼠标射线,通过与地面的交点来控制人物朝向 Ray ray = new Ray(); ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; Vector3 pos = Vector3.zero; if (Physics.Raycast(ray, out hit)) { pos = hit.point - transform.position; Vector3 newForward = Vector3.Slerp(transform.forward, pos, 5 * Time.deltaTime); newForward.y = 0; transform.forward = newForward; } if (Skiil.Instance.getShow()) //技能可以使用 { if (Input.GetMouseButton(0)) //鼠标左键输入 { //创建技能2的爆炸 CanAnimation = false; GameObject boom2 = Instantiate(Boom2) as GameObject; boom2.transform.position = pos + transform.position; boom2.transform.localScale = Vector3.one; SphereCollider c = boom2.AddComponent<SphereCollider>(); c.radius = 1.5f; c.isTrigger = true; Rigidbody r = boom2.AddComponent<Rigidbody>(); r.useGravity = false; num = 10; StartCoroutine(skillTime()); Skiil.Instance.setShow(); } if (Input.GetKeyDown("q")) //如果输入q建,让技能可用 { Skiil.Instance.setShow(); } } else { if (Input.GetKeyDown("q") && num < 0) //如果技能CD中,q不能用 { Skiil.Instance.setShow(); } } if (mAnimator && CanAnimation) { AnimatorStateInfo stateLayer1 = mAnimator.GetCurrentAnimatorStateInfo(1); //获取Animator的状态 mAnimator.SetFloat("Speed", h * h + v * v); //控制Speed的速度 mCController.SimpleMove(new Vector3(h, 0, v) * 2f); //用人物控制器来移动 if (Input.GetMouseButtonDown(0)) //输入左键人物普攻 { mAnimator.SetBool("DoubleAttack", true); } else { mAnimator.SetBool("DoubleAttack", false); } if (stateLayer1.IsName("JumpAttack")) //如果状态为特殊攻击 { if (show) { Invoke("ShowBoom", 0.5f); //延迟触发爆炸效果,和碰撞器 show = false; } } else { show = true; SphereCollider co = GetComponent<SphereCollider>(); co.enabled = false; } if (Input.GetMouseButtonDown(1)) //如果右键人物使用特殊攻击 { mAnimator.SetBool("JumpAttack", true); } else { mAnimator.SetBool("JumpAttack", false); } } } }
时间: 2024-10-27 03:27:14