公司最近忙着做业务,我也可以偷闲做做书里面的游戏,现在该我们做项目组了,吼吼,加油!!但也别忘了把书里的内容梳理总结一下。
射线:
定义射线时,默认可以这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward));
hit 表示是否射中目标,m_muzzlepoint.position表起始点,m_camTransform.TransformDirection(Vector3.forward)表方向(这里指m_camTransform的前方)。
游戏中一般这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
这里m_layer来确定射线有效捕获的层。开始定义好public LayerMask m_layer;后,在Inspector窗口中的属性m_layer下拉列表加载。
示例代码:
m_shootTimer -= Time.deltaTime;
if (Input.GetMouseButton(0)&&m_shootTimer<=0)
{
//射击间隔时间
m_shootTimer = 0.1f;
//射击音效
this.audio.PlayOneShot(m_audio);
//减少弹药,更新弹药UI
GameManager.Instance.SetAmmo(1);
RaycastHit info;
//从muzzlepoint的位置,向摄像机的正前方射出一根射线
//射线与m_player所指定的层碰撞
bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
if (hit)
{
if (info.transform.tag.CompareTo("enemy")==0)
{
Enemy enemy = info.transform.GetComponent<Enemy>();
//减少敌人生命
enemy.OnDamage(1);
}
//射中其他地方,释放一个粒子效果
Instantiate(m_fx, info.point, info.transform.rotation);
}
}
游戏主角属性:游戏主角的属性在脚步中定义,并全局使用,比如主角的位置:在主角控制脚步Start函数内获得,在其他脚本都可以调用。
m_agent.SetDestination(m_player.m_transform.position);//这是自动寻路物体m_agent,寻路目标为:m_player.m_transform.position,其中m_transform就是全局调用的Player.cs定义的属性
自动寻路:(P60)不懂不知道,一弄真心感觉简单,呵呵,开玩笑,听说还有好几种方法,都不会,我也别大言不惭了。
首先将场景模型的Static中的Navigation Static选中,无关的场景模型则确保没有被选中。具体是设置,可以在Window-->Navigation窗口中设置,
Radius和Height表寻路者的半径和高度。
Max Shope表最大攀爬坡度
Step Height表最大通过楼梯台阶高度
Drop Height表跳落高度极限
Jump Distance表跳跃极限
嗯嗯,完成设置后,点击右下角的Bake(烘焙),否则寻路物体无法移动且报错。
场景设置好后,开始设置寻路物体,首先添加Component-->Nav Mesh Agent组件,然后在脚步中来控制寻路。
Public class XL:MonoBehaviour()
{
Transform m_transform; //敌人的Transform组件
Player m_player; //游戏主角脚步组件
NavMeshAgent m_agent; //寻路组件
void Start()
{
m_transform = this.transform;
m_agent = GetComponent<NavMeshAgent>(); //获得寻路组件
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();//Player.cs脚本中定义了Player物体的位置,方便在寻路目标中调用
m_agent.SetDestination(m_player.m_transform.position); //设置m_agent寻路位置目标
MoveTo();
}
void MoveTo()
{
float speed = m_moveSpeed * Time.deltaTime;
m_agent.Move(m_transform.TransformDirection((new Vector3(0,0,speed))));
}
}
以上代码只执行初始寻路一次,根据实际情况可以在Update每一秒中寻路一次
m_timer -= Time.deltaTime;
if (m_timer<0)
{
m_timer = 1;
m_agent.SetDestination(m_player.m_transform.position);
}
实例:
public static GameManager Instance = null; //GameManager类中定义静态GameManager变量
void Start()
{
Instance = this;//实例化仅此一次
}
//其他脚本可以直接调用脚本内容了
GameManager.Instance.SetAmmo();
Unity3D中的实例必须用Instantiate(_model, point, rotate);
动画:
void Update()
{
AnimatorStateInfo stateInfo = m_ani.GetCurrentAnimatorStateInfo(0);//获取当前动画状态***********重要**
//如果处于待机状态
if (stateInfo.nameHash==Animator.StringToHash("Base Layer.idle")&&!m_ani.IsInTransition(0))
{
m_ani.SetBool("idle",false);//设置动画过渡条件
if (stateInfo.normalizedTime>=1.0f)//值位于0~1之间,0是动画开始,1是动画结束。此处表动画结束后
{
Destroy(this.gameObject);
}
}
小地图:提醒一个点,两个相机相互干扰的情况下,可以将Clear Flags设置为Depth ONLY;小地图要显示在前面,所以小地图相机的Camera组件的Depth要比主相机的Depth高一些。
射线:
定义射线时,默认可以这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward));
hit 表示是否射中目标,m_muzzlepoint.position表起始点,m_camTransform.TransformDirection(Vector3.forward)表方向(这里指m_camTransform的前方)。
游戏中一般这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
这里m_layer来确定射线有效捕获的层。开始定义好public LayerMask m_layer;后,在Inspector窗口中的属性m_layer下拉列表加载。
示例代码:
m_shootTimer -= Time.deltaTime;
if (Input.GetMouseButton(0)&&m_shootTimer<=0)
{
//射击间隔时间
m_shootTimer = 0.1f;
//射击音效
this.audio.PlayOneShot(m_audio);
//减少弹药,更新弹药UI
GameManager.Instance.SetAmmo(1);
RaycastHit info;
//从muzzlepoint的位置,向摄像机的正前方射出一根射线
//射线与m_player所指定的层碰撞
bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
if (hit)
{
if (info.transform.tag.CompareTo("enemy")==0)
{
Enemy enemy = info.transform.GetComponent<Enemy>();
//减少敌人生命
enemy.OnDamage(1);
}
//射中其他地方,释放一个粒子效果
Instantiate(m_fx, info.point, info.transform.rotation);
}
}
游戏主角属性:游戏主角的属性在脚步中定义,并全局使用,比如主角的位置:在主角控制脚步Start函数内获得,在其他脚本都可以调用。
m_agent.SetDestination(m_player.m_transform.position);//这是自动寻路物体m_agent,寻路目标为:m_player.m_transform.position,其中m_transform就是全局调用的Player.cs定义的属性
自动寻路:(P60)不懂不知道,一弄真心感觉简单,呵呵,开玩笑,听说还有好几种方法,都不会,我也别大言不惭了。
首先将场景模型的Static中的Navigation Static选中,无关的场景模型则确保没有被选中。具体是设置,可以在Window-->Navigation窗口中设置,
Radius和Height表寻路者的半径和高度。
Max Shope表最大攀爬坡度
Step Height表最大通过楼梯台阶高度
Drop Height表跳落高度极限
Jump Distance表跳跃极限
嗯嗯,完成设置后,点击右下角的Bake(烘焙),否则寻路物体无法移动且报错。
场景设置好后,开始设置寻路物体,首先添加Component-->Nav Mesh Agent组件,然后在脚步中来控制寻路。
Public class XL:MonoBehaviour()
{
Transform m_transform; //敌人的Transform组件
Player m_player; //游戏主角脚步组件
NavMeshAgent m_agent; //寻路组件
void Start()
{
m_transform = this.transform;
m_agent = GetComponent<NavMeshAgent>(); //获得寻路组件
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();//Player.cs脚本中定义了Player物体的位置,方便在寻路目标中调用
m_agent.SetDestination(m_player.m_transform.position); //设置m_agent寻路位置目标
MoveTo();
}
void MoveTo()
{
float speed = m_moveSpeed * Time.deltaTime;
m_agent.Move(m_transform.TransformDirection((new Vector3(0,0,speed))));
}
}
以上代码只执行初始寻路一次,根据实际情况可以在Update每一秒中寻路一次
m_timer -= Time.deltaTime;
if (m_timer<0)
{
m_timer = 1;
m_agent.SetDestination(m_player.m_transform.position);
}
实例:
public static GameManager Instance = null; //GameManager类中定义静态GameManager变量
void Start()
{
Instance = this;//实例化仅此一次
}
//其他脚本可以直接调用脚本内容了
GameManager.Instance.SetAmmo();
Unity3D中的实例必须用Instantiate(_model, point, rotate);
动画:
void Update()
{
AnimatorStateInfo stateInfo = m_ani.GetCurrentAnimatorStateInfo(0);//获取当前动画状态***********重要**
//如果处于待机状态
if (stateInfo.nameHash==Animator.StringToHash("Base Layer.idle")&&!m_ani.IsInTransition(0))
{
m_ani.SetBool("idle",false);//设置动画过渡条件
if (stateInfo.normalizedTime>=1.0f)//值位于0~1之间,0是动画开始,1是动画结束。此处表动画结束后
{
Destroy(this.gameObject);
}
}
小地图:提醒一个点,两个相机相互干扰的情况下,可以将Clear Flags设置为Depth ONLY;小地图要显示在前面,所以小地图相机的Camera组件的Depth要比主相机的Depth高一些。