1. 程式人生 > >【Unity 3D學習】滑鼠點選控制人物移動到目標位置

【Unity 3D學習】滑鼠點選控制人物移動到目標位置

一、第一種情況,不帶自動尋路功能。

	Vector3 targetPoint = Vector3.zero;     //滑鼠點選的位置
	CharacterController controller;

	void Start () {

		targetPoint = transform.position;
		controller = GetComponent<CharacterController>();
	}

	void Update () {

		if (Input.GetMouseButton (0)) {

			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			RaycastHit hit; 

			if (Physics.Raycast(ray, out hit)) {  

				//判斷點選的是否地形  
				if (!hit.collider.name.Equals("Plane")) {  
					return;  
				}  
				//點選位置座標   
				targetPoint = hit.point;  
				//轉向  
				transform.LookAt(new Vector3(targetPoint.x, transform.position.y, targetPoint.z));  
			}  
		}

		float distance = Vector3.Distance(targetPoint,transform.position);//計算目標位置到當前位置
		if(distance > 0.3f) {

			controller.SimpleMove(transform.forward * 5f);//角色移動
		} 
	}
二、第二種情況,加上自動尋路技術。
	Vector3 targetPoint = Vector3.zero;     //滑鼠點選的位置
	NavMeshAgent agent;  

	bool flag = false;       //控制到達目的地後輸出一次提示 

	void Start () {
		
		targetPoint = transform.position;
		agent = GetComponent<NavMeshAgent>();  
	}

	void Update () {

		if (Input.GetMouseButton (0)) {

			flag = false;

			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			RaycastHit hit; 

			if (Physics.Raycast(ray, out hit)) {  

				//判斷點選的是否地形  
				if (!hit.collider.name.Equals("Plane")) {  
					return;  
				}  
				//點選位置座標   
				targetPoint = hit.point;  
				//轉向  
				transform.LookAt(new Vector3(targetPoint.x, transform.position.y, targetPoint.z));

				//設定尋路的目標點  
				agent.SetDestination(targetPoint);
				agent.speed = 4f; 
			}  
		}

		if (agent.remainingDistance == 0 && !flag) {  

			flag = true;
			print ("到達了");
		}
	}

三、記錄一些遇到的問題。

1、使用第一種方式的時候,需要去掉元件“Nav Mesh Agent”,否則滑鼠點選了但是物體不移動,原因待查明。

2、每為一個物體加上元件“Nav Mesh Agent”的時候,都需要重新對地形烘焙一次,否則會出現編譯錯誤,“SetDestination can only be called on an active agent that has been placed on a navmesh”。