Unity3D基础18:物体查找与控制
前文:https://blog.****.net/Jaihk662/article/details/86763612(物体中心点与物体旋转)
前面已经实现了用按键控制物体Door的旋转如下:
而实际上你还有一个可以用上下左右控制的小方块:
那么问题来了:如何实现当且仅当小方块移动到Door里面,才允许用键盘控制Door的旋转呢?
一、空物体触发器
首先:肯定是要使用触发器判定当前小方块是否在Door里面,这个时候就需要一个触发器
可是使用触发器就无法实现碰撞体组件了,这个时候就需要一个空物体触发器,来间接控制Door
void OnTriggerEnter(Collider coll)
{
if(coll.gameObject.name=="Player")
{
flag = 1; //flag==1表示方块在"Door"的里面
}
}
void OnTriggerExit(Collider coll)
{
if (coll.gameObject.name == "Player")
{
flag = 0;
}
}
二、查找游戏模型
但是,触发器是触发器,它只是个空物体,那么如何使这个“空物体”控制“Door”的移动呢?
那当然是要先查找物体了
- GameObject.Find(string):静态方法,通过名字查找游戏物体
也就是可以直接通过 GameObject.Find("游戏物体名字").GetComponent<脚本名字>() 来获取对应的脚本组件,这个时候就可以在当前脚本里面调用对应脚本里面的方法了
空物体触发器脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LRtoDoor : MonoBehaviour
{
private Door mydoor;
private Transform myTransform;
private Rigidbody myRigidbody;
void Start()
{
mydoor = GameObject.Find("Door").GetComponent<Door>();
myTransform = gameObject.GetComponent<Transform>(); //获取相应对象的引用
myRigidbody = gameObject.GetComponent<Rigidbody>();
}
void Update()
{
}
void OnTriggerStay(Collider coll)
{
if (coll.gameObject.name=="Cube (3)") //如果方块进入了Door里面
{
Debug.Log("触发成功,可以用ZX键控制旋转");
mydoor.Rotate();
}
}
}
Door脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Door : MonoBehaviour
{
private Transform myTransform;
private Rigidbody myRigidbody;
void Start()
{
myTransform = gameObject.GetComponent<Transform>();
myRigidbody = gameObject.GetComponent<Rigidbody>();
}
void Update()
{
}
public void Rotate() //注意这要公有
{
if (Input.GetKeyDown(KeyCode.Z))
myTransform.Rotate(Vector3.down, 90); //按下Z键让物体沿世界坐标系前方旋转90°
if (Input.GetKeyDown(KeyCode.X))
myTransform.Rotate(Vector3.up, 90);
}
}
效果如下: