// Update is called once per frame void Update() { if (hold) { if (Input.GetMouseButtonUp(0)) { hold = false; var ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 500, 1 << SpinHitPadLayer)) { var v = ToVector2(Multi((hit.point - Center), DirVector)); var angle = Mathf.Atan2(v.x, v.y) - holdAngle; angle = (angle / (2 * Mathf.PI)) * 360; var rotation = RotateVector * angle; rotation = rotation + new Vector3(360, 360, 360); rotation += startRotation; var minDR = float.MaxValue; var idx = 0; for (var i = 0; i < AlignRotation.Length; i++) { var align = AlignRotation[i]; if (DR(align, rotation) < minDR) { minDR = DR(align, rotation); idx = i; } } var option = new RotateTo.RotateOptions(RotateObject, AlignRotation[idx], AlignTime); option.OnFinished += (sender, e) => { var callback = RotateObject.GetComponent <WaypointCallback>(); if (callback != null) { callback.ConnectCallback(idx); } }; RotateTo.Start(option); } SpinHitPad.gameObject.SetActive(false); } else { var ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 500, 1 << SpinHitPadLayer)) { var v = ToVector2(Multi((hit.point - Center), DirVector)); var angle = Mathf.Atan2(v.x, v.y) - holdAngle; angle = (angle / (2 * Mathf.PI)) * 360; var rotation = RotateVector * angle; rotation += startRotation; RotateObject.transform.Rotate(rotation - RotateObject.transform.rotation.eulerAngles); } } } }
public void Damage() { // 主角与敌人碰撞时(而非踩到了敌人),触发一个旋转动作(其实效果可以做的更有趣一些, // 比如先反弹到某一方向(FireTo),然后再弹回等等,此处仅仅举个例子) if (rotate == null) { // 旋转360度,每帧累加5度 rotate = new RotateTo(360f, 5f); rotate.SetActionListener(new RotateActionListener(this)); AddAction(rotate, hero); } else if (rotate.IsComplete()) { hero.SetFilterColor(LColor.red); // 直接重置rotate对象 rotate.Start(hero); // 重新插入(LGame的方针是Action事件触发且结束后,自动删除该事件,所以需要重新插入) AddAction(rotate, hero); } }