【问题标题】:Unity offscreen target indicator-how to show the way to an object with a specific tag?unity offscreen target indicator - 如何用特定标签显示到对象的路径?
【发布时间】:2018-10-12 12:04:16
【问题描述】:

UNITY 2D C#

大家好。 我有一个脚本,允许箭头显示点在哪里。

我的问题:

1) 我希望箭头显示通往具有特定标签或名称的点的路。

怎么做?

因为现在,显示通往点的路 (-50,0)。

谁能帮我改一下剧本?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CodeMonkey.Utils;


public class Window_QuestPointer : MonoBehaviour {

[SerializeField] private Camera uiCamera;



private Vector3 targetPosition;
private RectTransform pointerRectTransform;

private void Awake ()
{
    targetPosition = new Vector3 (-50, 0);
    pointerRectTransform = transform.Find ("Pointer").GetComponent<RectTransform> ();
}
private void Update (){
    Vector3 toPosition = targetPosition;
    Vector3 fromPosition = Camera.main.transform.position;
    fromPosition.z = 0f;
    Vector3 dir = (toPosition - fromPosition).normalized;
    float angle = UtilsClass.GetAngleFromVectorFloat(dir);
    pointerRectTransform.localEulerAngles = new Vector3 (0, 0, angle);

    float borderSize = 40f;

    Vector3 targetPositionScreenPoint = Camera.main.WorldToScreenPoint (targetPosition);
    bool isOffscreen = targetPositionScreenPoint.x <= borderSize || targetPositionScreenPoint.x >= Screen.width - borderSize || targetPositionScreenPoint.y <= borderSize || targetPositionScreenPoint.y >= Screen.height - borderSize;
    Debug.Log (isOffscreen + " " + targetPositionScreenPoint);

    if(isOffscreen){
        Vector3 cappedTargetScreenPosition = targetPositionScreenPoint;
        cappedTargetScreenPosition.x = Mathf.Clamp (cappedTargetScreenPosition.x, borderSize, Screen.width - borderSize);
        cappedTargetScreenPosition.y = Mathf.Clamp (cappedTargetScreenPosition.y, borderSize, Screen.height - borderSize);

        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (cappedTargetScreenPosition);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

    }
    else{
        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (targetPositionScreenPoint);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

}

} }

【问题讨论】:

  • 您的对象 targetPosition 设置为 (-50,0) 并且永远不会更改。您可能只需要在运行时更改此值。
  • 这个不能改成找到带标签的对象吗?

标签: unity3d indicator off-screen


【解决方案1】:
  1. 标记项目“目标”

  2. 将此添加到 Awake 方法的末尾以获取目标

    虚空唤醒(){ 离屏变换 = GameObject.FindGameObjectWithTag("target").GetComponent(); TargetPosition=offscreen.position; }

应该做的伎俩。我在手机上输入了这个,所以它应该是接近伪的。告诉我!

【讨论】:

  • 感谢您的回答。不幸的是,它不起作用: Assets / Window_QuestPointer.cs (21.18): error CS0029: Can not implicitly convert type UnityEngine.Transform 'to UnityEngine.Vector3' Assets / Window_QuestPointer.cs (20.36): error CS0117: UnityEngine.GameObject 'does not contain a definition for FindObjectWithTag' 但是谢谢:)
  • 对不起,我在打电话。我忘了从 transform 中获取向量三,将其设置为 transform.position 作为标签....
  • = GameObject.FindGameObjectsWithTag。我忘记了文字游戏,我又在玩手机了。道歉。我更新了答案,它现在应该可以工作了。
  • 还是有小问题:输入UnityEngine.GameObject' does not contain a definition for getComponent',找不到扩展方法getComponent' of type UnityEngine.GameObject'。您是否缺少程序集参考?但我已经更接近解决问题了 :) 非常感谢您的帮助 :)
  • 好吧,伙计们,这太容易了……我承认我很惭愧。这太简单了,我应该立即解决它。我刚刚改了:targetPosition = new Vector3 (-50, 0); to:targetPosition = GameObject.FindWithTag("Target").transform.position;
【解决方案2】:

问题解决。下面的好脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CodeMonkey.Utils;


public class Window_QuestPointer : MonoBehaviour {

[SerializeField] private Camera uiCamera;



private Vector3 targetPosition;
private RectTransform pointerRectTransform;

private void Awake ()
{
    targetPosition = GameObject.FindWithTag("Target").transform.position;
    pointerRectTransform = transform.Find ("Pointer").GetComponent<RectTransform> ();
}
private void Update (){
    Vector3 toPosition = targetPosition;
    Vector3 fromPosition = Camera.main.transform.position;
    fromPosition.z = 0f;
    Vector3 dir = (toPosition - fromPosition).normalized;
    float angle = UtilsClass.GetAngleFromVectorFloat(dir);
    pointerRectTransform.localEulerAngles = new Vector3 (0, 0, angle);

    float borderSize = 40f;

    Vector3 targetPositionScreenPoint = Camera.main.WorldToScreenPoint (targetPosition);
    bool isOffscreen = targetPositionScreenPoint.x <= borderSize || targetPositionScreenPoint.x >= Screen.width - borderSize || targetPositionScreenPoint.y <= borderSize || targetPositionScreenPoint.y >= Screen.height - borderSize;
    Debug.Log (isOffscreen + " " + targetPositionScreenPoint);

    if(isOffscreen){
        Vector3 cappedTargetScreenPosition = targetPositionScreenPoint;
        cappedTargetScreenPosition.x = Mathf.Clamp (cappedTargetScreenPosition.x, borderSize, Screen.width - borderSize);
        cappedTargetScreenPosition.y = Mathf.Clamp (cappedTargetScreenPosition.y, borderSize, Screen.height - borderSize);

        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (cappedTargetScreenPosition);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

    }
    else{
        Vector3 pointerWorldPosition = uiCamera.ScreenToWorldPoint (targetPositionScreenPoint);
        pointerRectTransform.position = pointerWorldPosition;
        pointerRectTransform.localPosition = new Vector3 (pointerRectTransform.localPosition.x, pointerRectTransform.localPosition.y, 0f);

}

} }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多