Jlovenpk1 Дата: Воскресенье, 03 Апреля 2016, 17:37 | Сообщение # 1
участник
Сейчас нет на сайте
Старый код в рпг стиле, работает все отлично, добавил свои плюху(как уклонение). Персонаж управляется через transofrm.position и при встречи гор он по ним ходит, как ниндзя, при встречи объектов проходит сквозь них. Дали совет, что бы персонаж не проходил через стены, использовать CC.MOVE(CharacterController.Move(Vector 3); Управление в старом виде, идет через Ray, Raycast получаем данные куда тыкнули кнопкой мыши и отправляем туда нашу модель, как только достигли таргета, модель останавливается. Вопрос, как это реализовать через CC.Move, т.к. p.s Попробовал я использовать Ray и при наведение курсором мыши на объект он удаляется, в итоге у меня удаляется террейн и не более :D привожу старый код:
Код
ing UnityEngine; using System.Collections; public class MoveRPG : MonoBehaviour { public float stopStart = 1.5f, speed = 5f, rotationSpeed = 100f, heightPlayer = 1f; private float mag, angleToTarget; private Ray ray; private RaycastHit hit; private Vector3 dir; private Vector3 target = new Vector3(); private Vector3 lastTarget = new Vector3(); public int speedrotation = 2; public Animation anima; private CharacterController controller; private bool walk; public Transform Target; private void Update() { controller = GetComponent<CharacterController>(); if (Input.GetMouseButton(0)) { ray = UnityEngine.Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 10000.0f)) { target = hit.point; } } LookAtThis(); MoveTo(); Dodge(); } private void CalculateAngle(Vector3 temp) { dir = new Vector3(temp.x, transform.position.y, temp.z) - transform.position; angleToTarget = Vector3.Angle(dir, transform.forward); } private void LookAtThis() { if (target != lastTarget) { CalculateAngle(target); if (angleToTarget > 3) transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.LookRotation(dir), rotationSpeed * UnityEngine.Time.deltaTime); //float MouseSens = 2.5f; //transform.RotateAround(Target.position, Vector3.up, hor * MouseSens * 300 * Time.deltaTime); } } private void MoveTo() { if (target != lastTarget) { if ((transform.position - target).sqrMagnitude > heightPlayer + 0.1f) { if (!walk) { Debug.Log("walk"); anima.Play("Run", PlayMode.StopAll); walk = true; } mag = (transform.position - target).magnitude; transform.position = Vector3.MoveTowards(transform.position, target, mag > stopStart ? speed * UnityEngine.Time.deltaTime : Mathf.Lerp(speed * 0.5f, speed, mag / stopStart) * UnityEngine.Time.deltaTime); ray = new Ray(transform.position, -Vector3.up); if (Physics.Raycast(ray, out hit, 10000.0f)) { transform.position = new Vector3(transform.position.x, hit.point.y + heightPlayer, transform.position.z); } } else { lastTarget = target; if (walk) { Debug.Log("idle"); anima.Play("stay", PlayMode.StopAll); walk = false; } } } } public void Dodge() { if (Input.GetKey("q")) { transform.Translate(Vector3.left * Time.deltaTime * 25f); anima.Play("Def",PlayMode.StopAll); anima.PlayQueued("stay"); walk = false; } if (Input.GetKey("e")) { transform.Translate(Vector3.right * Time.deltaTime * 25f); anima.Play("Def", PlayMode.StopAll); anima.PlayQueued("stay"); walk = false; } if (Input.GetKey("1")) { anima.Play("Attack1", PlayMode.StopAll); anima.PlayQueued("stay"); walk = false; } if (Input.GetKey("2")) { anima.Play("Attack2", PlayMode.StopAll); anima.PlayQueued("stay"); walk = false; } } }
DjanStudio