Ответ на первый вопрос. Выпускаешь луч (Raycast) из камеры, делаешь проверку "если это объект, который мне нужен (можешь искать как по компоненту, так и по имени или по тегу), то беру его позицию и записываю в поле типа Vector3" Например. Код
if(hit.collider.name == "Box For Me") {
posBox = hit.gameObject.transform.position;
}
После этого поле "posBox" присваиваешь к персонажу.
Вытекает и ответ на второй вопрос. При помощи рейкаста. RaycastHit hit; хранит в себе объект, когда какое либо условие равно истине. В моём примере был объект с именем "Box For Me" и только он. А чтобы взять индивидуальную клетку, можешь попробовать искать по тегу.
P.S. Я бы сделал вот так:
Код
using UnityEngine;
public class SomeClass : MonoBehaviour
{
GameObject player;
void Start()
{
player = GameObject.Find("Player"); //Находит персонажа по имени
}
void Update()
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit, 25))
{
if(Input.GetMouseButtonDown(0) && hit.collider.tag == "Platform") //Если нажата ЛКМ и Объект с тэгом "Platform", то присваиваем координаты
{
player.transform.position = hit.gameObject.transform.position;
}
}
}
}